[luoguP2606] [ZJOI2010]排列计数(DP)
传送门
如果能够根据题意看出这是一个堆的话,那么就有些思路了。。
首先堆顶必须是最小元素,然后左右儿子可以预处理出来都有多少个数,
把剩余的数任意分配给两个儿子,用排列组合即可
dp(now) = dp(now << 1) * dp(now << 1 | 1) * C(sum[now] 1, sum[now << 1])
#include <cstdio>#define N 5000001#define LL long longint n;LL p, inv[N], A[N], B[N], s[N];inline LL C(int x, int y)inline LL dp(int now)int main()for(i = 1; i <= n; i++)for(j = i; j; j >>= 1) s[j]++;printf("%lld\n", (dp(1) + p) % p);return 0;}
上一篇:[luoguP2053] [SCOI2007]修车(最小费用最大流)
DP
spc文件怎么看,spc文件用什么打开?
0文件怎么看,0文件用什么打开?
sparseimage文件怎么看,sparseimage文件用什么打开?
sp文件怎么看,sp文件用什么打开?
dv文件怎么看,dv文件用什么打开?
soundpack文件怎么看,soundpack文件用什么打开?
dus文件怎么看,dus文件用什么打开?
dtw文件怎么看,dtw文件用什么打开?
spdf文件怎么看,spdf文件用什么打开?
0文件怎么看,0文件用什么打开?