P4345 [SHOI2015] 超能粒子炮·改 题解

· · 题解

Solution

p=2333,题意为 f(n,k)=\displaystyle\sum_{i=0}^k\binom{n}{i}\bmod p

由于 p 为质数,有卢卡斯定理:\displaystyle\sum_{i=0}^k\binom{\lfloor\frac{n}{p}\rfloor}{\lfloor\frac{i}{p}\rfloor}\binom{n\bmod p}{i\bmod p}\bmod p

枚举 $\left\lfloor\dfrac{i}{p}\right\rfloor$:$\left(\displaystyle\sum_{i=0}^{\lfloor\frac{k}{p}\rfloor-1}\binom{\lfloor\frac{n}{p}\rfloor}{i}\sum_{j=0}^{p-1}\binom{n\bmod p}{j}+\binom{\lfloor\frac{n}{p}\rfloor}{\lfloor\frac{k}{p}\rfloor}\sum_{i=0}^{k\bmod p}\binom{n\bmod p}{i}\right)\bmod p$。 观察出三大坨和式都符合 $f$ 的形式,此时把 $f$ 套进去。 即 $\left(f\left(\left\lfloor\dfrac{n}{p}\right\rfloor,\left\lfloor\dfrac{k}{p}\right\rfloor-1\right)f(n\bmod p,p-1)+\displaystyle\binom{\lfloor\frac{n}{p}\rfloor}{\lfloor\frac{k}{p}\rfloor}f(n\bmod p,k\bmod p)\right)\bmod p$。 预处理出 $\forall i,j\in[0,p)$ 的 $f(i,j)$ 与 $\displaystyle\binom{i}{j}$,只需递归计算 $f\left(\left\lfloor\dfrac{n}{p}\right\rfloor,\left\lfloor\dfrac{k}{p}\right\rfloor-1\right)$ 与 $\displaystyle\binom{\lfloor\frac{n}{p}\rfloor}{\lfloor\frac{k}{p}\rfloor}$,其余可直接调用预处理得到的结果。 # Code ```cpp #include<stdio.h> typedef long long ll; const int mod=2333; int c[mod][mod]; int C(ll n,ll m){ if(n<mod&&m<mod)return c[n][m]; return 1ll*C(n/mod,m/mod)*c[n%mod][m%mod]%mod; } int s[mod][mod]; int calc(ll n,ll m){ if(m<0)return 0; if(n<mod&&m<mod)return s[n][m]; return (1ll*s[n%mod][mod-1]*calc(n/mod,m/mod-1)+1ll*C(n/mod,m/mod)*s[n%mod][m%mod])%mod; } int T; ll n,m; int main(){ for(int i=0;i<mod;++i){ c[i][0]=c[i][i]=1; for(int j=1;j<i;++j) if((c[i][j]=c[i-1][j]+c[i-1][j-1])>=mod)c[i][j]-=mod; } for(int i=0;i<mod;++i){ s[i][0]=1; for(int j=1;j<mod;++j) if((s[i][j]=s[i][j-1]+c[i][j])>=mod)s[i][j]-=mod; } scanf("%d",&T); while(T--) scanf("%lld%lld",&n,&m), printf("%d\n",calc(n,m)); return 0; } ```