题目:
用贝尔三角形 p^2 地预处理 p 以内的贝尔数。可以模(mod-1)(它是每个分解下的质因子的倍数,所以不影响分开算的时候)。
用公式:\( Bell[n+p^{m}]=m*Bell[n]+Bell[n+1] (mod p) \) \( Bell[n+p]=Bell[n]+Bell[n+1] (mod p) \) 把 n 看成 p 进制,O( p^2 * log m ) 地算。
大概就是从低位走到高位。一开始自己的 b 数组是 Bell[ 0 ] ~ Bell[ p ] ;枚举每一个 p 进制位(从第二位,即 p1 开始),在该位上枚举从1到d[ i ],做一次让角标 + pi 的操作;
这样做完,自己的 b 数组存的就是 Bell[ d[m-1]*pm-1+d[m-2]*pm-2+...+0 ] ~ Bell[ d[m-1]*pm-1+d[m-2]*pm-2+...+p ] 的值。只要输出 b[ d[0] ] 就行了。
借鉴Claris的模板。
#include#include #include #include #define ll long longusing namespace std;const int mod=999999599,M=mod-1,N=7283;ll n,m; int p[5]={ 2,13,5281,7283},ans,f[N+5],s[2][N+5];void upd(int &x,int md){x>=md?x-=md:0;}int pw(int x,int k,int md){ int ret=1;while(k){ if(k&1)ret=(ll)ret*x%md;x=(ll)x*x%md;k>>=1;}return ret;}int calc(ll n,int p){ if(n<=N)return f[n]%p; int b[N+5],c[N+5],d[65],lm=0; for(int i=0;i<=p;i++)b[i]=f[i]%p; while(n)d[lm++]=n%p,n/=p; for(int i=1;i