【題解】Loj6485 LJJ 學二項式定理
阿新 • • 發佈:2021-08-16
\(\text{Solution:}\)
觀察到這個東西的下標是帶 \(\bmod\) 的,而且組合數的形式很像二項式定理。考慮單位根反演把下標的 \(\bmod 4\) 去掉。
\[\sum_{i=0}^n \binom{n}{i}s^ia_{i\bmod 4} \\ =\sum_{i=0}^n \binom{n}{i}s^i\sum_{j=0}^3 a_j[j\equiv i(\bmod 4)] \\ =\sum_{i=0}^n \binom{n}{i}s^i\sum_{j=0}^3 a_j[4|(i-j)] \\ =\sum_{i=0}^n \binom{n}{i}s^i\sum_{j=0}^3 a_j\frac{1}{4}\sum_{k=0}^3 \omega_{4}^{k(i-j)} \\ =\frac{1}{4}\sum_{j=0}^3 a_j\sum_{k=0}^3 \omega_{4}^{-kj}\sum_{i=0}^n \binom{n}{i}s^i \omega_4^{ki} \\ =\frac{1}{4}\sum_{j=0}^3 a_j\sum_{k=0}^3 \omega_{4}^{-kj}(s\omega_4^k+1)^n \]觀察到在 \(\bmod 998244353\)
注意到指數上是整除的,所以存在。
於是單次計算就可以 \(O(\log n)\) 了。
#include<bits/stdc++.h> using namespace std; #define int long long const int mod=998244353; const int g=3; inline int Add(int x,int y){return (x+y)%mod;} inline int Mul(int x,int y){return 1ll*x*y%mod;} inline int qpow(int x,int y){ int res=1; while(y){ if(y&1)res=Mul(res,x); x=Mul(x,x);y>>=1; } return res; } int T,n,s,a[4],Pw[50]; inline int getinv(int x){return qpow(x,mod-2);} signed main(){ scanf("%lld",&T); int W=qpow(3,(mod-1)/4); Pw[0]=1; for(int i=1;i<=20;++i)Pw[i]=Mul(Pw[i-1],W); while(T--){ scanf("%lld%lld",&n,&s); for(int i=0;i<4;++i)scanf("%lld",&a[i]); int ans=0; for(int i=0;i<4;++i){ int sum=0; for(int j=0;j<4;++j){ int wn=getinv(Pw[i*j]); int swk=Mul(s,qpow(W,j)); int spw=qpow(swk+1,n); sum=Add(sum,Mul(wn,spw)); } ans=Add(ans,Mul(a[i],sum)); } ans=Mul(ans,getinv(4)); printf("%lld\n",ans); } return 0; }