[LOJ 6485 LJJ 学二项式定理] 题解/单位根反演小记

注意

该文章原文于 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} [ab(modn)]=[ab0(modn)]=n1k=0n1ωn(ab)k=n1k=0n1ωnakωnbk

LOJ 6485 LJJ 学二项式定理

给定 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=0n((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=0n((in)×si×aimod4)i=0n((in)×sij=03aj[ij(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} [ij(mod4)]=41k=03ω4ikω4jk
所以:
∑ 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=0n((in)×sij=03aj[ij(mod4)])i=0n((in)×sij=03aj×41k=03ω4ikω4jk)41k=03j=03ajω4jki=0n(in)siω4ik41k=03j=03ajω4jki=0n(in)(sω4k)i41k=03j=03ajω4jk(sω4k+1)n
(注:模 p p p 意义下 ω n 1 = g ( m o d − 1 ) / n \omega_n^1 = g^{(mod-1)/n} ωn1=g(mod1)/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(mod1)/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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值