注意
该文章原文于 2024-02-16 10:38 发表于洛谷,链接与文章内容在此留作保存。
单位根反演
[ a ≡ b ( m o d n ) ] = [ a − b ≡ 0 ( m o d n ) ] = 1 n ∑ k = 0 n − 1 ω n ( a − b ) k = 1 n ∑ k = 0 n − 1 ω n a k ω n − b k [a \equiv b \pmod n] = [a-b \equiv 0 \pmod n] = \frac{1}{n} \sum \limits_{k=0}^{n-1} \omega_{n}^{(a-b)k} = \frac{1}{n} \sum \limits_{k=0}^{n-1} \omega_{n}^{ak} \omega_{n}^{-bk} [a≡b(modn)]=[a−b≡0(modn)]=n1k=0∑n−1ωn(a−b)k=n1k=0∑n−1ωnakωn−bk
给定 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 ) \sum \limits_{i = 0}^n \left( \binom{n}{i} \times s^i \times a_{i \bmod 4} \right) i=0∑n((in)×si×aimod4)
模 998244353 998244353 998244353 的值。
有:
∑
i
=
0
n
(
(
n
i
)
×
s
i
×
a
i
m
o
d
4
)
=
∑
i
=
0
n
(
(
n
i
)
×
s
i
∑
j
=
0
3
a
j
[
i
≡
j
(
m
o
d
4
)
]
)
\begin{aligned} & \sum \limits_{i = 0}^n \left( \binom{n}{i} \times s^i \times a_{i \bmod 4} \right)\\ = & \sum \limits_{i = 0}^n \left( \binom{n}{i} \times s^i \sum \limits_{j=0}^3 a_j [i \equiv j \pmod 4] \right)\\ \end{aligned}
=i=0∑n((in)×si×aimod4)i=0∑n((in)×sij=0∑3aj[i≡j(mod4)])
由单位根反演可知:
[
i
≡
j
(
m
o
d
4
)
]
=
1
4
∑
k
=
0
3
ω
4
i
k
ω
4
−
j
k
[i \equiv j \pmod 4] = \frac{1}{4} \sum \limits_{k=0}^3 \omega_{4}^{ik} \omega_{4}^{-jk}
[i≡j(mod4)]=41k=0∑3ω4ikω4−jk
所以:
∑
i
=
0
n
(
(
n
i
)
×
s
i
∑
j
=
0
3
a
j
[
i
≡
j
(
m
o
d
4
)
]
)
=
∑
i
=
0
n
(
(
n
i
)
×
s
i
∑
j
=
0
3
a
j
×
1
4
∑
k
=
0
3
ω
4
i
k
ω
4
−
j
k
)
=
1
4
∑
k
=
0
3
∑
j
=
0
3
a
j
ω
4
−
j
k
∑
i
=
0
n
(
n
i
)
s
i
ω
4
i
k
=
1
4
∑
k
=
0
3
∑
j
=
0
3
a
j
ω
4
−
j
k
∑
i
=
0
n
(
n
i
)
(
s
ω
4
k
)
i
=
1
4
∑
k
=
0
3
∑
j
=
0
3
a
j
ω
4
−
j
k
(
s
ω
4
k
+
1
)
n
\begin{aligned} & \sum \limits_{i = 0}^n \left( \binom{n}{i} \times s^i \sum \limits_{j=0}^3 a_j [i \equiv j \pmod 4] \right)\\ = & \sum \limits_{i = 0}^n \left( \binom{n}{i} \times s^i \sum \limits_{j=0}^3 a_j \times \frac{1}{4} \sum \limits_{k=0}^3 \omega_{4}^{ik} \omega_{4}^{-jk}\right)\\ = & \frac{1}{4} \sum \limits_{k=0}^3 \sum \limits_{j=0}^3 a_j \omega_4^{-jk} \sum \limits_{i=0}^n \binom{n}{i} s^i \omega_4^{ik}\\ = & \frac{1}{4} \sum \limits_{k=0}^3 \sum \limits_{j=0}^3 a_j \omega_4^{-jk} \sum \limits_{i=0}^n \binom{n}{i} (s \omega_4^k)^i \\ = & \frac{1}{4} \sum \limits_{k=0}^3 \sum \limits_{j=0}^3 a_j \omega_4^{-jk} (s \omega_4^k + 1)^n\\ \end{aligned}
====i=0∑n((in)×sij=0∑3aj[i≡j(mod4)])i=0∑n((in)×sij=0∑3aj×41k=0∑3ω4ikω4−jk)41k=0∑3j=0∑3ajω4−jki=0∑n(in)siω4ik41k=0∑3j=0∑3ajω4−jki=0∑n(in)(sω4k)i41k=0∑3j=0∑3ajω4−jk(sω4k+1)n
(注:模
p
p
p 意义下
ω
n
1
=
g
(
m
o
d
−
1
)
/
n
\omega_n^1 = g^{(mod-1)/n}
ωn1=g(mod−1)/n)
由于 998244353 998244353 998244353 的原根是 3 3 3,所以 w 4 1 = g ( m o d − 1 ) / 4 w_4^1 = g^{(mod-1)/4} w41=g(mod−1)/4。
然后就可以计算了。
#include <iostream>
#include <cstdio>
using namespace std;
typedef long long ll;
const ll mod = 998244353;
int T, w, s, a[4];
ll n, ans;
inline ll chk(ll x) {
return x >= mod ? x - mod : x;
}
inline ll fpm(ll a, ll k = mod - 2) {
ll res = 1;
while (k) {
if (k & 1)
res = res * a % mod;
a = a * a % mod;
k >>= 1;
}
return res;
}
int main() {
w = fpm(3, (mod - 1) / 4);
scanf("%d", &T);
while (T--) {
scanf("%lld %d %d %d %d %d", &n, &s, &a[0], &a[1], &a[2], &a[3]);
ans = 0;
for (int k = 0; k < 4; k++)
for (int j = 0; j < 4; j++)
ans = chk(ans + 1ll * a[j] * fpm(fpm(w), j * k) % mod * fpm(1ll * s * fpm(w, k) % mod + 1, n) % mod);
printf("%lld\n", 1ll * ans * fpm(4) % mod);
}
return 0;
}