【积性函数+欧拉函数+狄利克雷卷积】2017CCPC杭州站B——HDU-6265 Master of Phi
http://acm.hdu.edu.cn/showproblem.php?pid=6265
题意:
一次输入一个正数分解质因数的各项底数与指数,求算:
∑
d
∣
n
ρ
(
d
)
∗
(
n
∣
d
)
\sum{_{d|n}} \rho(d)* {(n|d)}
∑d∣nρ(d)∗(n∣d)
知识补充:
狄利克雷
三连:
(1)狄利克雷卷积: ( f ∗ g ) ( n ) = ∑ d ∣ n f ( d ) ∗ g ( n ∣ d ) (f*g)(n)=\sum{_{d|n}} f(d)*g(n|d) (f∗g)(n)=∑d∣nf(d)∗g(n∣d)
(2)两个积性函数的狄利克雷卷积仍是积性函数
(3)欧拉函数和 f ( x ) = x f(x)=x f(x)=x都是积性函数
那么就可以看出积性函数:
h ( d ) = ∑ d ∣ n ρ ( d ) ∗ ( n ∣ d ) h(d)=\sum{_{d|n}} \rho(d)*(n|d) h(d)=∑d∣nρ(d)∗(n∣d)
根据积性函数
的特性,
h
(
d
)
=
∏
i
=
1
m
h
(
p
i
q
i
)
h(d)=\prod{_{i=1}^{m}}h(p_i^{q_i})
h(d)=∏i=1mh(piqi),下面要解决的就是如何求
h
(
p
q
)
h(p^q)
h(pq)
由题给公式可以得到:(p是质数(n的质因子)),d的所有取值可能有{
1
,
p
1
,
p
2
,
p
3
,
.
.
.
,
p
q
1,p^1,p^2,p^3,...,p^q
1,p1,p2,p3,...,pq}
h
(
p
q
)
=
∑
d
∣
p
q
ρ
(
d
)
∗
(
p
q
∣
d
)
=
∑
i
=
0
q
ρ
(
p
i
)
∗
p
q
−
i
h(p^q)=\sum_{d|p^q}\rho(d)*(p^q|d)=\sum_{i=0}^q\rho(p^i)*p^{q-i}
h(pq)=d∣pq∑ρ(d)∗(pq∣d)=i=0∑qρ(pi)∗pq−i
根据欧拉函数:
ρ
(
p
k
)
=
p
k
∗
(
1
−
1
∣
p
)
\rho(p^k)=p^k*(1-1|p)
ρ(pk)=pk∗(1−1∣p)
维基百科证明
进一步化解:
h
(
p
q
)
=
p
q
+
∑
i
=
1
q
p
i
(
1
−
1
∣
p
)
∗
p
q
−
i
=
p
q
+
p
q
−
1
∗
(
p
−
1
)
∗
q
h(p^q)=p^q+\sum_{i=1}^q p^i(1-1|p)*p^{q-i} =p^q+p^{q-1}*(p-1)*q
h(pq)=pq+i=1∑qpi(1−1∣p)∗pq−i=pq+pq−1∗(p−1)∗q
所以推倒得到公式:
a
n
s
=
∏
p
q
+
p
q
−
1
(
p
−
1
)
∗
q
ans=\prod p^q+p^{q-1}(p-1)*q
ans=∏pq+pq−1(p−1)∗q
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int MOD=998244353;
ll powmod(ll a,ll n,ll mod)
{
ll ret=1;
a%=mod;
while(n)
{
if(n&1)ret=ret*a%mod;
a=a*a%mod;
n>>=1;
}
return ret;
}
int main()
{
int t;
cin>>t;
while(t--)
{
ll m;
cin>>m;
ll sum=1;
//
while(m--)
{
ll p,q;
cin>>p>>q;
ll tmp=0;
tmp=(tmp+powmod(p,q,MOD))%MOD;
tmp=(tmp+powmod(p,q-1,MOD)*(p-1)%MOD*q%MOD)%MOD;
sum=(sum*tmp)%MOD;
}
cout<<sum<<endl;
}
return 0;
}