博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj 2111: [ZJOI2010]Perm 排列计数【树形dp+lucas】
阅读量:5071 次
发布时间:2019-06-12

本文共 1043 字,大约阅读时间需要 3 分钟。

是我想复杂了

首先发现大于关系构成了一棵二叉树的结构,于是树形dp
设f[i]为i点的方案数,si[i]为i点的子树大小,递推式是\( f[i]=f[i*2]*f[i*2+1]*C_{si[i]-1}^{si[i*2]} \)
组合数用Lucas求

#include
#include
using namespace std;long long n,p,f[5000005],jc[5000005],s[5000005];long long ksm(long long a,long long b){ long long r=1; while(b) { if(b&1) r=r*a%p; a=a*a%p; b>>=1; } return r;}long long C(long long x,long long y){ if(y>x) return 0; return jc[x]*ksm(jc[y]*jc[x-y]%p,p-2)%p;}long long luc(long long x,long long y){ if(!y) return 1; return C(x%p,y%p)*luc(x/p,y/p)%p;}void dfs(long long u){ s[u]=1;f[u]=1;f[u<<1]=1;f[u<<1|1]=1; if((u<<1)<=n) dfs(u<<1),s[u]+=s[u<<1]; if((u<<1|1)<=n) dfs(u<<1|1),s[u]+=s[u<<1|1]; f[u]=f[u<<1]*f[u<<1|1]%p*luc(s[u]-1,s[u<<1])%p;}int main(){ scanf("%lld%lld",&n,&p); jc[0]=jc[1]=1; for(long long i=2;i<=n;i++) jc[i]=jc[i-1]*i%p; dfs(1); printf("%lld",f[1]); return 0;}

转载于:https://www.cnblogs.com/lokiii/p/8530525.html

你可能感兴趣的文章
graphite custom functions
查看>>
一个自己写的判断2个相同对象的属性值差异的工具类
查看>>
oracle连接的三个配置文件(转)
查看>>
Python内置函数(29)——help
查看>>
Android TextView加上阴影效果
查看>>
《梦断代码》读书笔记(三)
查看>>
Java8 Lambda表达应用 -- 单线程游戏server+异步数据库操作
查看>>
AngularJS学习篇(一)
查看>>
关于Xshell无法连接centos6.4的问题
查看>>
css3动画——基本准则
查看>>
输入月份和日期,得出是今年第几天
查看>>
pig自定义UDF
查看>>
spring security 11种过滤器介绍
查看>>
代码实现导航栏分割线
查看>>
大数据学习系列(8)-- WordCount+Block+Split+Shuffle+Map+Reduce技术详解
查看>>
【AS3代码】播放FLV视频流的三步骤!
查看>>
枚举的使用
查看>>
luogu4849 寻找宝藏 (cdq分治+dp)
查看>>
日志框架--(一)基础篇
查看>>
关于源程序到可运行程序的过程
查看>>