题意:求Σfi^m%p。 zoj上p是1e9+7,牛客是1e9; 对于这两个,分别有不同的做法。
前者利用公式。 后者可以分解mod,然后利用循环节搞。
#include <bits/stdc++.h> using namespace std; typedef long long LL; const int N = 100005; const LL MOD = 1000000009; LL fac[N],A[N],B[N]; void Init() { fac[0] = 1; for(int i=1; i<N; i++) fac[i] = fac[i-1] * i % MOD; A[0] = B[0] = 1; for(int i=1; i<N; i++) { A[i] = A[i-1] * 691504013 % MOD; B[i] = B[i-1] * 308495997 % MOD; } } LL quick_mod(LL a,LL b,LL MOD) { LL ans = 1; a %= MOD; while(b){ if(b&1){ ans = ans * a % MOD; b--; } b>>=1; a = a * a % MOD; } return ans; } LL Solve(LL n,LL k) { LL ans = 0; for(int r=0; r<=k; r++) { LL t = A[k-r] * B[r] % MOD; LL x = fac[k]; LL y = fac[k-r] * fac[r] % MOD; LL c = x * quick_mod(y,MOD-2,MOD) % MOD; LL tmp = t * (quick_mod(t,n,MOD) - 1) % MOD * quick_mod(t-1,MOD-2,MOD) % MOD; if(t == 1) tmp = n % MOD; tmp = tmp * c % MOD; if(r & 1) ans -= tmp; else ans += tmp; ans %= MOD; } LL m = quick_mod(383008016,MOD-2,MOD); ans = ans * quick_mod(m,k,MOD) % MOD; ans = (ans % MOD + MOD) % MOD; return ans; } int main() { int T; LL n,k; Init(); scanf("%d",&T); while(T--) { cin>>n>>k; cout<<Solve(n,k)<<endl; } return 0; }