传送门
如果能够根据题意看出这是一个堆的话,那么就有些思路了。。
首先堆顶必须是最小元素,然后左右儿子可以预处理出来都有多少个数,
把剩余的数任意分配给两个儿子,用排列组合即可
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;}
上一篇:[BZOJ3054] Rainbow的信号(考虑位运算 + DP?)
下一篇:[BZOJ2393] Cirno的完美算数教室(dfs+容斥原理)
DP









