LOJ 6485 LJJ 学二项式定理——单位根反演

题目:https://loj.ac/problem/6485

\( \sum\limits_{k=0}^{3}\sum\limits_{i=0}^{n}C_{n}^{i}s^{i}a_{k}[4|(i-k)] \)

然后就是套路即可。

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
ll rdn()
{
  ll ret=0;bool fx=1;char ch=getchar();
  while(ch>'9'||ch<'0'){if(ch=='-')fx=0;ch=getchar();}
  while(ch>='0'&&ch<='9')ret=ret*10+ch-'0',ch=getchar();
  return fx?ret:-ret;
}
const int N=5,mod=998244353;
int upt(ll x,int mod){x%=mod;if(x<0)x+=mod;return x;}
int pw(int x,ll k)
{int ret=1;while(k){if(k&1)ret=(ll)ret*x%mod;x=(ll)x*x%mod;k>>=1;}return ret;}
int T,s,a[N],iv4,w[N];ll n;
void init()
{
  iv4=pw(4,mod-2);
  w[0]=1;w[1]=pw(3,(mod-1)/4);
  w[2]=(ll)w[1]*w[1]%mod; w[3]=(ll)w[2]*w[1]%mod;
}
int main()
{
  T=rdn();init();
  while(T--)
    {
      n=rdn();s=rdn();for(int i=0;i<4;i++)a[i]=rdn();
      int ans=0;
      for(int k=0;k<4;k++)
    {
      int ret=0;
      for(int j=0;j<4;j++)ret=(ret+(ll)w[upt(j*(n-k),4)]*pw(s+w[upt(-j,4)],n))%mod;
      ans=(ans+(ll)a[k]*ret)%mod;
    }
      ans=(ll)ans*iv4%mod; printf("%d\n",ans);
    }
  return 0;
}

 

posted on 2019-01-16 09:23  Narh  阅读(241)  评论(0编辑  收藏  举报

导航