1. 程式人生 > >LOJ #6485 LJJ 學二項式定理

LOJ #6485 LJJ 學二項式定理

QwQ

LOJ #6485


題意

求題面中那個算式


題解

牆上暴利

設$ f(x)=(sx+1)^n$

假設求出了生成函式$ f$的各項係數顯然可以算出答案

因為模$ 4$的緣故只要對於每個餘數算出次數模4為該餘數的係數和即可

求係數和強上單位根反演即可

求模4餘1相當於求模4餘0之後平移一位即乘上$ x^{-1}$

好像講的非常不清楚啊...


程式碼

#include<ctime>
#include<cmath>
#include<cstdio>
#include<cstring>
#include
<iostream> #include<algorithm> #include<queue> #include<vector> #define p 998244353 #define rt register int #define ll long long using namespace std; inline ll read(){ ll x=0;char zf=1;char ch=getchar(); while(ch!='-'&&!isdigit(ch))ch=getchar();
if(ch=='-')zf=-1,ch=getchar(); while(isdigit(ch))x=x*10+ch-'0',ch=getchar();return x*zf; } void write(ll y){if(y<0)putchar('-'),y=-y;if(y>9)write(y/10);putchar(y%10+48);} void writeln(const ll y){write(y);putchar('\n');} int k,m,n,x,y,z,cnt,ans,a[4],w[4]; int ksm(int x,int y){ int ans=1
; for(rt i=y;i;i>>=1,x=1ll*x*x%p)if(i&1) ans=1ll*ans*x%p; return ans; } int main(){ w[0]=1;w[1]=ksm(3,(p-1)/4);w[2]=1ll*w[1]*w[1]%p;w[3]=1ll*w[1]*w[2]%p; for(rt T=read();T;T--){ n=read()%(p-1);int s=read(); for(rt i=0;i<4;i++)a[i]=read(); int sum=0; for(rt j=0;j<4;j++){ const int v=ksm(1ll*s*w[j]%p+1,n); for(rt i=0;i<4;i++){ (sum+=1ll*a[i]*v%p*w[4-i*j&3]%p)%=p; } } writeln(1ll*sum*ksm(4,p-2)%p); } return 0; }