单位根反演
[k∣n]=1k∑i=0k−1ωkin[k\mid n]=\frac 1k\sum_{i=0}^{k-1}\omega_k^{in}[k∣n]=k1∑i=0k−1ωkin
kkk 次单位根是 kkk 次幂为 111 的复数解 wkw_kwk。利用单位圆和单位根的关系很容易证明。
-
k∣nk\mid nk∣n
显然 ωkin\omega_k^{in}ωkin,相当于转了 ink\frac{in}kkin 圈单位圆,结果仍是 111。
1k∑i=0k−11=1=k∣n\frac 1k\sum_{i=0}^{k-1}1=1=k\mid nk1∑i=0k−11=1=k∣n
-
k∤nk\nmid nk∤n
使用等比数列求和。
[k∣n]=1k∑i=0k−1ωkin=1k⋅ωknk−1ωkn−1[k\mid n]=\frac 1k\sum_{i=0}^{k-1}\omega_k^{in}=\frac 1k·\frac{\omega_k^{nk}-1}{\omega_k^n-1}[k∣n]=k1∑i=0k−1ωkin=k1⋅ωkn−1ωknk−1
∵ωknk−1=ωk0−1=0∧ωkn−1≠0\because\omega_k^{nk}-1=\omega_k^0-1=0\wedge \omega_k^n-1\neq 0∵ωknk−1=ωk0−1=0∧ωkn−1=0
∴1k∑i=0k−1ωkin=0=[k∣n]=k∤n\therefore \frac 1k\sum_{i=0}^{k-1}\omega_k^{in}=0=[k\mid n]=k\nmid n∴k1∑i=0k−1ωkin=0=[k∣n]=k∤n
LOJ6485. LJJ学二项式定理
TTT 组数据,给定 n,s,a0,a1,a2,a3n,s,a_0,a_1,a_2,a_3n,s,a0,a1,a2,a3,求 ∑i=0nC(n,i)⋅si⋅ai(mod4)\sum_{i=0}^nC(n,i)·s^i·a_{i\pmod 4}∑i=0nC(n,i)⋅si⋅ai(mod4)。结果对 998244353998244353998244353 取模。
趁热打铁,我们很容易想到将 iii 按模 444 的余数进行分类。对于每一类我们只想统计该统计的数。
∑i=0n(ni)si∑j=03aj[imod 4=j]=∑i=0n(ni)si∑j=03aj[4∣(i−j)]\sum_{i=0}^n\binom nis^i\sum_{j=0}^3a_j[i\ \text{mod}\ 4=j]=\sum_{i=0}^n\binom nis^i\sum_{j=0}^3a_j[4\mid(i-j)] i=0∑n(in)sij=0∑3aj[i mod 4=j]=i=0∑n(in)sij=0∑3aj[4∣(i−j)]
直接单位根反演:[4∣(i−j)]=14∑k=03ω4k(i−j)[4|(i-j)]=\frac{1}{4}\sum_{k=0}^3\omega_{4}^{k(i-j)}[4∣(i−j)]=41∑k=03ω4k(i−j)
⇒∑i=0n(ni)si⋅14∑j=03aj⋅∑k=03ω4kiω4−kj=14∑j=03aj∑k=03ω4−kj∑i=0n(ni)siω4ki\Rightarrow \sum_{i=0}^n\binom nis^i·\frac 14\sum_{j=0}^3a_j·\sum_{k=0}^3\omega_4^{ki}\omega_4^{-kj}=\frac 14\sum_{j=0}^3a_j\sum_{k=0}^3\omega_4^{-kj}\sum_{i=0}^n\binom nis^i\omega_4^{ki} ⇒i=0∑n(in)si⋅41j=0∑3aj⋅k=0∑3ω4kiω4−kj=41j=0∑3ajk=0∑3ω4−kji=0∑n(in)siω4ki
二项式定理:∑i=0n(ni)siω4ki=∑i=0n(ni)(sω4k)i=(sω4k+1)n\sum_{i=0}^n\binom nis^i\omega_4^{ki}=\sum_{i=0}^n\binom ni(s\omega_4^k)^i=(s\omega_4^k+1)^n∑i=0n(in)siω4ki=∑i=0n(in)(sω4k)i=(sω4k+1)n
⇒14∑j=03aj∑k=03ω4−jk(sω4k+1)n\Rightarrow \frac 14\sum_{j=0}^3a_j\sum_{k=0}^3\omega_4^{-jk}(s\omega_4^k+1)^n ⇒41j=0∑3ajk=0∑3ω4−jk(sω4k+1)n
模 998244353998244353998244353 意义下是有四次单位根的,且原根为 333,有 ω41=g(mod−1)/4\omega_4^1=g^{(mod-1)/4}ω41=g(mod−1)/4。
直接算即可。
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define mod 998244353
int T, n, s;
int a[10], w[10] = { 1, 911660635, 998244352, 86583718 };int qkpow( int x, int y ) {int ans = 1;while( y ) {if( y & 1 ) ans = ans * x % mod;x = x * x % mod;y >>= 1;}return ans;
}signed main() {scanf( "%lld", &T );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 ++ )( sum += w[(4 - i) * j % 4] * qkpow( s * w[j] % mod + 1, n ) ) %= mod;( ans += sum * a[i] ) %= mod;}printf( "%lld\n", ans * qkpow( 4, mod - 2 ) % mod );}return 0;
}
/*
6
1 2 3 4 5 6
2 3 4 5 6 1
3 4 5 6 1 2
4 5 6 1 2 3
5 6 1 2 3 4
6 1 2 3 4 5
*/