LOJ #6485. LJJ 学二项式定理

LOJ #6485. LJJ 学二项式定理

单位根反演练手题。

[sum_{i=0}^{n}inom{n}{i}s^ia_{imod 4}\ sum_{j=0}^{3}sum_{i=0}^{n}[imod 4=j]s^ia_jinom{n}{i}\ =sum_{j=0}^{3}sum_{i=0}^{n}dfrac{1}{4}sum_{k=0}^{3}omega_{4}^{ik}omega_{4}^{-jk}s^ia_jinom{n}{i}\ =dfrac{1}{4}sum_{j=0}^{3}sum_{k=0}^{3}omega_{4}^{-jk}a_jsum_{i=0}^{n}inom{n}{i}(omega_{4}^{k}s)^i\ =dfrac{1}{4}sum_{j=0}^{3}sum_{k=0}^{3}omega_{4}^{-jk}a_j(omega_{4}^{k}s+1)^{n}\ ]

(mod 998244353) 意义下 (omega_{4}^{1})(g^{frac{mod-1}{4}}) (原根)有同样的性质,直接用后者就好了。

#define mod 998244353
inline int qpow(int n,int k){int res=1;for(;k;k>>=1,n=1ll*n*n%mod)if(k&1)res=1ll*n*res%mod;return res;}
inline void fmod(int&x){x-=mod,x+=x>>31&mod;}
const int iv4=qpow(4,mod-2);
int s,a[4],w[4],ans;
LL n;
void Main(){
	ans=0;
	scanf("%lld%d%d%d%d%d",&n,&s,&a[0],&a[1],&a[2],&a[3]);
	rep(j,0,3)rep(k,0,3){
		int x=1ll*a[j]*w[(16-j*k)%4]%mod;
		int y=qpow((1ll*w[k]*s+1)%mod,n%(mod-1));
		fmod(ans+=1ll*x*y%mod);
	}
	ans=1ll*ans*iv4%mod;
	printf("%d
",ans);
}
signed main(){
	w[0]=1,w[1]=qpow(3,(mod-1)/4),w[2]=1ll*w[1]*w[1]%mod,w[3]=1ll*w[1]*w[2]%mod;
	for(int T=read();T;--T)Main();
}

路漫漫其修远兮,吾将上下而求索
原文地址:https://www.cnblogs.com/zzctommy/p/14333438.html