1. 程式人生 > 其它 >【題解】Loj6485 LJJ 學二項式定理

【題解】Loj6485 LJJ 學二項式定理

LJJ 學二項式定理

\(\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\)

下,其 \(4\) 次單位根是存在的,原根為 \(3,\) 又因為 \(a^{mod-1}\equiv 1(\bmod mod),\) 故而 \(\omega_4=g^{\frac{mod-1}{4}}\)

注意到指數上是整除的,所以存在。

於是單次計算就可以 \(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;
}