正题
题目链接:https://loj.ac/p/6247
题目大意
给出n,kn,kn,k求
∑0≤i≤n,i∣k(ni)\sum_{0\leq i\leq n,i|k}\binom{n}{i}0≤i≤n,i∣k∑(in)
对998244353998244353998244353取模
1≤n≤1015,1≤k≤220,k=2p(p∈N)1\leq n\leq 10^{15},1\leq k\leq 2^{20},k=2^p(p\in N)1≤n≤1015,1≤k≤220,k=2p(p∈N)
解题思路
随便找的一题竟然是单位根反演,不过很基础而且很裸。
首先单位根反演的式子[i∣k]=1k∑j=0k−1ωki×j[i|k]=\frac{1}{k}\sum_{j=0}^{k-1}\omega_k^{i\times j}[i∣k]=k1∑j=0k−1ωki×j
然后带到这题的式子就是
∑i=0n1k∑j=0k−1ωki×j(ni)\sum_{i=0}^n\frac{1}{k}\sum_{j=0}^{k-1}\omega_k^{i\times j}\binom{n}{i}i=0∑nk1j=0∑k−1ωki×j(in)
然后把jjj提出来
1k∑j=0k−1∑i=0n(ωki)j(ni)\frac{1}{k}\sum_{j=0}^{k-1}\sum_{i=0}^n(\omega_k^{i})^j\binom{n}{i}k1j=0∑k−1i=0∑n(ωki)j(in)
然后二项式定理
1k∑j=0k−1(ωki+1)n\frac{1}{k}\sum_{j=0}^{k-1}(\omega_k^{i}+1)^nk1j=0∑k−1(ωki+1)n
额但是nnn很大直接用复数精度肯定会炸,但是998244353−1=223×7×17998244353-1=2^{23}\times 7\times 17998244353−1=223×7×17…又因为k=2pk=2^pk=2p,其实就是类似于NTTNTTNTT的思路我们直接用原根ωk1=gP−1k\omega_k^1=g^{\frac{P-1}{k}}ωk1=gkP−1就好了。
时间复杂度O(klogn)O(k\log n)O(klogn)
code
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll P=998244353;
ll n,k,ans;
ll power(ll x,ll b){ll ans=1;while(b){if(b&1)ans=ans*x%P;x=x*x%P;b>>=1;}return ans;
}
signed main()
{scanf("%lld%lld",&n,&k);ll g=power(3,(P-1)/k),z=1;for(ll i=0;i<k;i++,z=z*g%P)(ans+=power(z+1,n)%P)%=P;printf("%lld\n",ans*power(k,P-2)%P);return 0;
}