LGP4714题解

没意思啊

题意:求 \(1^{k+2}(n)\),其中规定 \(1^k\)\(k=1\) 时为 \(1\),在 \(2 \leq k\) 时为 \(1 * 1^{k-1}\)* 为狄利克雷卷积,\(1(n)=1\))。

给一个积性函数,然后求其值,先将其分解质因数,在质数幂处分别求值,最后乘起来。

所以问题变成了求 \(1^k(p^K)\)

设多项式 \(F_p^k(x)=\sum_{i=0}^{\infty}1^k(p^K)x^i\)

很明显对于所有 \(p\),当 \(k\) 相同时,\(F_p^k\) 是相等的。

而在这个意义下,求 \(f(p^K)\)就变成了求 \([x^K](F_p^1(x))^k\)

很明显 \(F_p^1(x)=\sum_{i=0}^{\infty}x^i\),所以 \(f(p^K)\) 实际上就是对多项式 \(1\)\(k+2\) 遍前缀和。

然后根据P5488,我们能够得到 \(f(p^K)=\binom K {K+k}=\frac {\prod_{i=1}^K(k+i)} {K!}\)

然后就是分解质因子了,因为懒得写 PR 所以看了题解,把常用的三个质数特判了一下(

#include<cstdio>
const int M=1e6+5,mod=998244353;
int k,ans=1,top,inv[75],pri[M];bool zhi[M];
long long x,n;
inline int Add(const int&a,const int&b){
	return a+b>=mod?a+b-mod:a+b;
}
inline int Del(const int&a,const int&b){
	return b>a?a-b+mod:a-b;
}
inline void sieve(const int&M){
	register int i,j,x;
	for(i=2;i<=M;++i){
		if(!zhi[i])pri[++top]=i;
		for(j=1;(x=i*pri[j])<=M;++j){
			zhi[i]=true;
			if(!(i%pri[j]))break;
		}
	}
	pri[++top]=mod;pri[++top]=1e9+7;pri[++top]=1e9+9;
}
inline int calc(const int&n){
	register int i,ans=1;
	for(i=1;i<=n;++i)ans=1ll*ans*inv[i]%mod*Del(Add(n+2,k),i)%mod;
	return ans;
}
signed main(){
	register int i,cnt;
	scanf("%lld%lld",&n,&x);k=x%mod;
	sieve(1e6);inv[1]=1;
	for(i=2;i<=70;++i)inv[i]=1ll*(mod-mod/i)*inv[mod%i]%mod;
	for(i=1;i<=top&&1ll*pri[i]*pri[i]<=n;++i){
		if(n%pri[i])continue;cnt=0;
		while(!(n%pri[i]))n/=pri[i],++cnt;
		ans=1ll*ans*calc(cnt)%mod;
	}
	if(n>1)ans=1ll*ans*calc(1)%mod;
	printf("%d",ans);
}
posted @ 2022-01-10 16:42  Prean  阅读(8)  评论(0编辑  收藏  举报
var canShowAdsense=function(){return !!0};