F[i]=f[l]*f[r]*c (Size[l]+size[r],size[l]).
Need Lucas.
#include <iostream>#include<cstdio>#include<cstring>#include<algorithm>#defineMAXN 1000050using namespacestd;Long LongN,MOD,INV1[MAXN],INV2[MAXN],F[MAXN],SIZE[MAXN];Long LongF_pow (Long LongXLong Longy) { Long Longans=1,Base=x; while(y) {if(y&1) ans= (ans*Base)%MoD; Base=(Base*Base)%MoD; Y>>=1; } returnans;}voidget_table () {inv1[0]=1; inv2[0]=mod+1; for(Long LongI=1; i<=n;i++) {Inv1[i]=inv1[i-1]*i%MoD; Inv2[i]=f_pow (inv1[i],mod-2); }}Long LongComb (Long LongNLong Longm) { returninv1[n]*inv2[m]%mod*inv2[n-m]%MoD;}Long LongLucasLong LongNLong Longm) { if(!m)return 1; returnComb (n%mod,m%mod) *lucas (n/mod,m/mod)%MoD;}intMain () {scanf ("%lld%lld",&n,&MoD); Get_table (); for(Long Longi=n;i>=1; i--) {Size[i]=1;Long LongL=0, r=0; f[i]=1; if((i<<1) <=n) {size[i]+=size[i<<1];l=size[i<<1];f[i]=f[i]*f[i<<1]%MoD;} if((i<<1|1) <=n) {size[i]+=size[i<<1|1];r=size[i<<1|1];f[i]=f[i]*f[i<<1|1]%MoD;} F[i]=f[i]*lucas (l+r,l)%MoD; } printf ("%lld\n", f[1]%MoD); return 0;}
Bzoj 2111 Permutation count