noip模擬58(待補)
阿新 • • 發佈:2021-09-22
「Lesson5!·貝爾數·穿越廣場·舞動的夜晚」
A. Lesson5!
B. 貝爾數
考場上只差一個矩陣快速冪.
還是對快速冪的模型掌握的不夠好.
快速冪一定是有周期性的,是有規律可尋的.
而本題中可以看出是對連續的一端區間取模.
那麼一定就應該是一段週期性的序列.
每次可以選擇把序列向左移動 \(P\ -\ 1\) 個格子.
於是快速冪就很可做了.
B_code
#include<bits/stdc++.h> using namespace std; namespace BSS { #define ll long long int #define ull unsigned ll #define lf double #define lbt(x) (x&(-x)) #define mp(x,y) make_pair(x,y) #define lb lower_bound #define ub upper_bound #define Fill(x,y) memset(x,y,sizeof x) #define Copy(x,y) memcpy(x,y,sizeof x) #define File(x,y) freopen(#x,"r",stdin),freopen(#y,"w",stdout) #define FILE(x) freopen(#x".in","r",stdin),freopen(#x".out","w",stdout) inline ll read() { int ss=0; bool cit=1; char ch; while(!isdigit(ch=getchar())) if(ch=='-') cit=0; while(isdigit(ch)) ss=(ss<<3)+(ss<<1)+(ch^48),ch=getchar(); return cit?ss:-ss; } } using namespace BSS; const ll mod=95041567; ll m,n,Ts,ans; ll md[7]={0,31,37,41,43,47}; ll f[57],bell[1007]; ll C[1007][1007],g[57][57]; ll exgcd(ll a,ll b,ll &x,ll &y){ if(!b) return x=1,y=0,a; ll d=exgcd(b,a%b,x,y),z=x; return x=y,y=z-y*(a/b),d; } inline void mul(ll now){ ll c[57]={0}; for(int i=1;i<=now;i++){ for(int j=1;j<=now;j++) c[i]=(c[i]+f[j]*g[j][i]%now)%now; } Copy(f,c); } inline void mulself(ll now){ ll c[57][57]={0}; for(int i=1;i<=now;i++){ for(int j=1;j<=now;j++) for(int k=1;k<=now;k++) c[i][j]=(c[i][j]+g[i][k]*g[k][j]%now)%now; } Copy(g,c); } inline ll solve(ll x){ Fill(g,0),Fill(f,0); ll b=n/(md[x]-1),st=n%(md[x]-1); for(int i=1;i<=md[x];i++){ f[i]=bell[st+i-1]%md[x]; } g[md[x]][1]=1; for(int i=2;i<=md[x];i++) g[i-1][i]=1,g[i][i]=1; for(;b;b>>=1,mulself(md[x])) if(b&1) mul(md[x]); return f[1]%md[x]; } signed main(){ FILE(bell); bell[0]=1,bell[1]=1; for(int i=0;i<=1000;i++){ C[i][0]=1; for(int j=1;j<=i;j++) C[i][j]=(C[i-1][j]+C[i-1][j-1])%mod; } for(int i=1;i<=1000;i++){ for(int j=0;j<=i;j++){ bell[i+1]=(bell[i+1]+C[i][j]*bell[j]%mod)%mod; } } Ts=read(); ll res,cnt,x,y; while(Ts--){ n=read(),ans=0; if(n<=1000){ printf("%lld\n",bell[n]); continue; } for(int i=1;i<=5;i++){ res=solve(i),exgcd(mod/md[i],md[i],x,y); ans=(ans+(x%md[i]+md[i])%mod*res%mod*(mod/md[i])%mod)%mod; } printf("%lld\n",ans%mod); } exit(0); }
C. 穿越廣場
考場感覺一定是個 \(dp\).
但是沒有再去考慮和字串有關的演算法.