# 标题 欧拉( 哦啦 ^-^ )
考察对积性函数性质以及欧拉函数的应用,线性筛实现
首先从 “柿子” 开始分析:
欧拉函数:φ(n)=∑d∣nd μ(dn) 是 积性函数 ,由 φ∗I (*表示狄利克雷卷积) 而来 ;
同理:F(n)=∑d∣ndk μ(dn) 是由φ∗Id(n) 而来 ;
观察“柿子”容易发现:
if( n = Prime ) : F(n)=nk−1 ;(类似欧拉函数性质)
esle :
if gcd(a,b)=1 :
F(a∗b)=F(a)∗F(b) ( 由积性函数性质易知 )
else :
首先我们考虑当 n=pm 时 ,
F(n)=∑d∣ndkμ(dn)
=1μ(pm)+(pk)μ(pm−1)+....+(pm−1)kμ(p)+(pm)kμ(1)
=0+0+....+(pm−1)kμ(p)+(pm)kμ(1)
=(pmk)−(pm−1)k
=(pm−1)k(pk−1)
其次我们考虑当 n=a∗pw(gcd(a,p)==1)
F(n)=F(a)∗F(pw)
=F(a)∗(pw−1)k∗(pk−1)
F(n∗p)=F(a∗pw+1)=F(a)∗F(pw+1)
=F(a)∗(pw)k∗(pk−1)
=F(n)∗pk
=F(n)∗(F(p)+1)
∴F(n∗p)=F(n)∗(F(p)+1)
理论推导完毕!
接下来是代码:
const int N = 5e6+5;
const int Max = 998244353 ;
#define M 5000000
int m , k ;
int prime[N] ;
int ans[N] ;
bool vis[N] ;
void init()
{
ans[1] = 1 ;
int cnt = 0 ;
for( int i = 2 ; i <= M ; ++ i ){
if( !vis[i] ){
prime[++cnt] = i ;
ans[i] = QuickPow( i , k )-1 ;//QuickPow为快速幂 i^k%mod
}
for( int j = 1 ; j <= cnt && 1ll*i*prime[j] <= M ; ++ j ){
vis[ i*prime[j] ] = 1 ;
if( i % prime[j] == 0 ){
ans[ i*prime[j] ] = ans[i] * ( ans[ prime[j] ] + 1 ) % Max ;
break ;
}
else {
ans[ i*prime[j] ] = ans[i] * ans[ prime[j] ] % Max;
}
}
}
}
如有错误,欢迎留言指出
点个赞呗⁂((✪⥎✪))⁂**
附加:
