【loj6485】LJJ学二项式定理【单位根反演】【二项式】

传送门

也是板子。求

(\sum_{i=0}^ns^i\binom{n}{i}a_{i\mod 4})\mod 998244353

对于这个下标取模,我们直接拆成四个式子,形如

\sum_{i=0}^n\binom{n}{i}s^ia_k[4|i-k]

直接单位根反演后面这一坨

\frac{1}{4}\sum_{i=0}^n\binom{n}{i}s^ia_k\sum_{j=0}^3\omega_4^{ij-kj}

\frac{1}{4}a_k\sum_{j=0}^3(s\omega_4^j+1)^n\omega_4^{(4-k)j}

然后就可以做了,最后那一个跟着走就行。

把k取遍0123加起来。记得除以4。

 

 

#include<bits/stdc++.h>
using namespace std;
#define in read()
#define int long long
int in{
	int cnt=0,f=1;char ch=0;
	while(!isdigit(ch)){
		ch=getchar();if(ch=='-')f=-1;
	}
	while(isdigit(ch)){
		cnt=cnt*10+ch-48;
		ch=getchar(); 
	}return cnt*f;
}
const int mod=998244353;
int n,s,a[5];
int w;int ans;
int ksm(int a,int b){
	int sum=1;a%=mod;
	while(b){
		if(b&1)sum=sum*a%mod;a=a*a%mod;b>>=1;
	}return sum;
}
signed main(){
	int t=in;w=ksm(3,(mod-1)/4);
	while(t--){
		n=in;s=in;for(int i=0;i<4;i++)a[i]=in;
		ans=0;
		for(int i=0;i<4;i++){
			for(int j=0,ww=1;j<4;j++,ww=ww*w%mod)
			ans=(ans+a[i]*ksm(s*ww%mod+1,n)%mod*ksm(ww,4-i)%mod)%mod;
		}
		cout<<ans*ksm(4,mod-2)%mod<<'\n';
	}
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值