LJJ 学二项式定理

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

给定 n , s , a 0 , a 1 , a 2 , a 3 n,s,a_0,a_1,a_2,a_3 n,s,a0,a1,a2,a3,求
[ ∑ i = 0 n ( n i ) s i a i    m o d    4 ]    m o d    99824453 \Big[\sum_{i=0}^{n}{n\choose i}s^ia_{i\;mod\;4}\Big]\;mod\; 99824453 [i=0n(in)siaimod4]mod99824453

思路:

  • 单位根反演
    [ n ∣ k ] = 1 n ∑ i = 0 n − 1 ω n k i [n|k]=\frac{1}{n}\sum_{i=0}^{n-1}\omega^{ki}_n [nk]=n1i=0n1ωnki

∑ i = 0 n ( n i ) s i a i    m o d    4 = ∑ j = 0 3 a j ∑ i = 0 n ( n i ) s i [ i    m o d    4 = j ] = ∑ j = 0 3 a j ∑ i = 0 n ( n i ) s i [ 4 ∣ i − j ] = ∑ j = 0 3 a j ∑ i = 0 n 1 4 ( n i ) s i ∑ k = 0 3 ω 4 k ( i − j ) = 1 4 ∑ j = 0 3 a j ∑ k = 0 3 ω 4 − k j ∑ i = 0 n ( n i ) s i ω 4 k i = 1 4 ∑ j = 0 3 a j ∑ k = 0 3 ω 4 − k j ( s ω 4 k + 1 ) n \begin{aligned} &\sum_{i=0}^{n}{n\choose i}s^ia_{i\;mod\;4}\\ =&\sum_{j=0}^{3}a_j\sum_{i=0}^{n}{n\choose i}s^i[i\;mod\;4=j]\\ =&\sum_{j=0}^{3}a_j\sum_{i=0}^{n}{n\choose i}s^i[4|i-j]\\ =&\sum_{j=0}^{3}a_j\sum_{i=0}^{n}\frac{1}{4}{n\choose i}s^i\sum_{k=0}^{3}\omega^{k(i-j)}_4\\ =&\frac{1}{4}\sum_{j=0}^{3}a_j\sum_{k=0}^{3}\omega^{-kj}_4\sum_{i=0}^{n}{n\choose i}s^i\omega^{ki}_4\\ =&\frac{1}{4}\sum_{j=0}^{3}a_j\sum_{k=0}^{3}\omega^{-kj}_4(s\omega^k_4+1)^n \end{aligned} =====i=0n(in)siaimod4j=03aji=0n(in)si[imod4=j]j=03aji=0n(in)si[4ij]j=03aji=0n41(in)sik=03ω4k(ij)41j=03ajk=03ω4kji=0n(in)siω4ki41j=03ajk=03ω4kj(sω4k+1)n

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int mod = 998244353;
const int w [] = {
    
    1,911660635,998244352,86583718};
ll T,n,s,ans,res,inv;
ll a[4];
ll ksm (ll a,ll b) {
    
    
    a%=mod;
    ll s=1;
    for (; b; b>>=1,a=a*a%mod)
        if (b&1)
            s=s*a%mod;
    return s;
}
int main () {
    
    
    scanf("%lld",&T);
    inv=ksm(4,mod-2);
    while (T--) {
    
    
        scanf("%lld%lld%lld%lld%lld%lld",&n,&s,&a[0],&a[1],&a[2],&a[3]);
        ans=0;
        for (int i=0; i<=3; ++i) {
    
    
            res=0;
            for (int j=0; j<=3; ++j)
                res=(res+w[(4-i*j%4)%4]*ksm(s*w[j]+1,n)%mod)%mod;
            ans=(ans+a[i]*res%mod)%mod;
        }
        printf("%lld\n",ans*inv%mod);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_43520313/article/details/109264403
ljj