首页 > 其他分享 >BZOJ 2111([ZJOI2010]Perm 排列计数-乘法逆元+完全二叉树模型+数列分数表示法)

BZOJ 2111([ZJOI2010]Perm 排列计数-乘法逆元+完全二叉树模型+数列分数表示法)

时间:2022-10-25 11:05:04浏览次数:85  
标签:return cout int long ZJOI2010 二叉树 include Perm jc


2111: [ZJOI2010]Perm 排列计数


Time Limit: 10 Sec   Memory Limit: 259 MB

Submit: 478  

Solved: 283

[​​Submit​​][​​Status​​][​​Discuss​​]


Description


称一个1,2,...,N的排列P1,P2...,Pn是Magic的,当且仅当2<=i<=N时,Pi>Pi/2. 计算1,2,...N的排列中有多少是Magic的,答案可能很大,只能输出模P以后的值


Input


输入文件的第一行包含两个整数 n和p,含义如上所述。


Output


输出文件中仅包含一个整数,表示计算1,2,⋯, �的排列中, Magic排列的个数模 p的值。


Sample Input


20 23


Sample Output


16


HINT


100%的数据中,1 ≤ � N ≤ 106, P� ≤ 10^9,p是一个质数。



显然可以把这题看成-有n个节点的完全二叉树(小根堆性质)的排列数。


那就把最小的那个拎出来,其它的点随便塞入2边(不影响结果)。


接下来就是把答案分解成分数,乘法逆元啥的。。。


lyd的 ​​题解​



#include<cstdio>
#include<cmath>
#include<functional>
#include<iostream>
#include<algorithm>
using namespace std;
#define MAXN (1000000+1)
#define eps (1e-9)
int n,F;
int exgcd(int a,int b,long long &x,long long &y){if (!b) {x=1,y=0;return a;}int ans=exgcd(b,a%b,x,y);long long z=x;x=y;y=z-(a/b)*y;return ans;}
long long f[MAXN],g[MAXN],jc[MAXN];
long long mulinv(int b)
{
long long x,y;
exgcd(b,F,x,y);
// return ((-x)/F*F+F+x)%F;
return (x+abs(x)/F*F+F)%F;
}
int main()
{
scanf("%d%d",&n,&F);
f[0]=g[0]=f[1]=g[1]=1%F;
jc[0]=jc[1]=1;
for (int i=2;i<=n;i++) jc[i]=jc[i-1]*i%F;
for(int i=2;i<=n;i++)
{
int dep=(int)(log(i)/log(2)+eps)+1;
int l=(int)pow(2.0,dep-2)-1;
// cout<<l<<' '<<(int)(eps+pow(2.0,dep-2))<<' '<<(i-1-2*l)<<' ';
l+=min((i-1-2*l),(int)(eps+pow(2.0,dep-2)));
int r=i-l-1;
// cout<<i<<' '<<dep<<' '<<l<<' '<<r<<' '<<f[l]<<' '<<f[r]<<endl;
f[i]=f[l]*f[r]%F*jc[i-1]%F;
g[i]=g[l]*g[r]%F*jc[l]%F*jc[r]%F;
}
// cout<<f[n]<<' '<<g[n]<<endl;
cout<<f[n]*mulinv(g[n])%F<<endl;
return 0;
}




标签:return,cout,int,long,ZJOI2010,二叉树,include,Perm,jc
From: https://blog.51cto.com/u_15724837/5794147

相关文章

  • CF 286A(Lucky Permutation-数列找规律)
    A.LuckyPermutationtimelimitpertestmemorylimitpertestinputoutputp......
  • 7-1 二叉树遍历应用
    读入用户输入的一串字符串,将字符串按照先序遍历建立一个二叉树。其中“#”表示的是空格,代表空树。再对建立好的二叉树进行中序遍历,输出遍历结果。#include<iostream>#i......
  • Zabbix在服务器上执行Agent上的脚本时返回Permission denied,在页面上显示该item为"Not
    [root@uat-otherzabbix]#zabbix_get-s IP地址-p10050-kkeysh:脚本:Permissiondenied排查问题:1、脚本的执行权限、用户组等2、脚本所在目录的权限,一层层排......
  • 二叉树的四种遍历顺序
    题目102二叉树的层序遍历思路用队列实现层序遍历。代码#Definitionforabinarytreenode.#classTreeNode:#def__init__(self,val=0,left=None,righ......
  • 完全二叉树的节点数
    222.完全二叉树的节点个数中文语境和英文语境似乎有点区别,我们说的完全二叉树对应英文CompleteBinaryTree,没有问题。但是我们说的满二叉树对应英文PerfectBinaryTr......
  • 力扣 114. 二叉树展开为链表-原地算法(O(1) 额外空间)详解
    114.二叉树展开为链表给你二叉树的根结点 root ,请你将它展开为一个单链表:展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而......
  • 【二叉树】两棵二叉搜索树中的所有元素
    0x00题目给你​​root1​​​和​​root2​​​这两棵二叉搜索树请你返回一个列表其中包含​​​两棵树​​​中的所有整数并按​​升序​​排序0x01思路二叉搜......
  • 【二叉树】删点成林
    0x00题目给出二叉树的根节点​​root​​​树上每个节点都有一个不同的值如果节点值在​​to_delete​​中出现我们就把该节点从树上​​删去​​最后得到一个森林(......
  • 【二叉树】二叉树中的最长交错路径
    0x00题目给你一棵以​​root​​为根的二叉树,二叉树中的交错路径定义如下:选择二叉树中​​任意​​​节点和一个方向(​​左​​​或者​​右​​​)如果前进方向为​​......
  • 【二叉树】最大层内元素和
    0x00题目给你一个二叉树的根节点​​root​​​设根节点位于二叉树的第​​1​​层而根节点的子节点位于第​​2​​层依此类推请返回层内元素之和​​​最大​​......