Loj#6247. 九个太阳

Loj#6247. 九个太阳

题解

前置知识

原根

二项式定理

单位根

题目

给定 n,Kn,K,满足KK22 的幂,求

Ki,0in(ni)\sum_{K\mid i, 0 \le i \le n} \dbinom{n}{i}

998244353998244353 取模 。

1n1015,1K2201 \le n \le 10^{15}, 1\le K \le 2^{20} , 且 KK22 的幂 。

思路

首先将式子写为 :

i=0n(ni)[Ki]\sum_{i=0}^n \dbinom{n}{i} [K \mid i]

然后观察式子中的条件🤔 ,可以用单位根反演 :

1ni=0n1ωnxi=[xmodn=0]\frac{1}{n} \sum_{i=0}^{n-1} \omega_n^{x \ast i} = [x \bmod n =0]

化简式子为 :

i=0n(ni)[Ki]=i=0n1Kj=0K1ωnij(ni)=1Ki=1nj=0K1ωnij(ni)=1Kj=0K1i=0n(ωnj)i(ni)\begin{aligned} \sum_{i=0}^n \dbinom{n}{i} [K \mid i] &=\sum_{i=0}^n \frac{1}{K} \sum_{j=0}^{K-1} \omega_n^{i \ast j} \dbinom{n}{i}\\ &=\frac{1}{K} \sum_{i=1}^{n} \sum_{j=0}^{K-1} \omega_n^{i \ast j} \dbinom{n}{i}\\ &=\frac{1}{K} \sum_{j=0}^{K-1} \sum_{i=0}^n (\omega_n^{j})^i \dbinom{n}{i} \end{aligned}

然后观察后面的式子,对其使用二项式定理!

(a+b)n=i=0n(ni)aibni(a+b)^n = \sum_{i=0}^n \dbinom{n}{i} a^i b^{n-i}

拆分为 :

1Kj=0K1i=0n(ωnj)i(ni)=1Kj=0K1(1+ωnj)n\begin{aligned} \frac{1}{K} \sum_{j=0}^{K-1} \sum_{i=0}^n (\omega_n^{j})^i \dbinom{n}{i} &=\frac{1}{K} \sum_{j=0}^{K-1} (1+\omega_n^j)^n \end{aligned}

计算时由于 998244353=223×17×7+1998244353 = 2^{23} \times 17 \times 7 +1 刚好存在原根 33

998244353最优美的性质莫过于它是个完美恶臭数:998244353=( 114514 * ( 54-1+114 * (1+14*5+1+4) ) ) + ( 4+11451 * (4-1-15+14) ) + ( 11+41*54 + (141+541) ) + (4-1-15+14);之所以称为完美,如果您仔细观察,您会发现每一个括号里114514都出现了正整数次!

ωn\omega_n 设为 3p1K3^{\frac{p-1}{K}} 即可

时间复杂度 O(nlogn)O(n \log n)

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int mod=998244353;
ll ans;
ll qpow(ll a,ll b,ll mod)
{
ll t=1;
while(b!=0)
{
if(b&1)t=(t*a)%mod;
a=(a*a)%mod;b>>=1;
}
return t;
}
ll inv(ll x){return (qpow(x,mod-2,mod)+mod)%mod;}
int main()
{
ll n,k;
scanf("%lld%lld",&n,&k);
ll wn=qpow(3,(mod-1)/k,mod);
for(ll i=0,c=1;i<k;i++,c=c*wn%mod)
{
ans=(ans+qpow(1+c,n,mod))%mod;
}
printf("%lld",(ans*inv(k)%mod+mod)%mod);
return 0;
}
作者

Jekyll_Y

发布于

2022-07-22

更新于

2023-03-02

许可协议

评论