题目大意:
题目链接:https://jzoj.net/senior/#main/show/5340
题目图片:
http://wx2.sinaimg.cn/mw690/0060lm7Tly1fwepmh2hffj30jp0cwac2.jpg
http://wx4.sinaimg.cn/mw690/0060lm7Tly1fwepmh2vacj30jq0e8mxt.jpg
求
N
M
N^M
NM的因子和。
思路:
首先把
N
N
N分解质因数,那么可以得到
N
=
d
[
1
]
k
[
1
]
×
d
[
2
]
k
[
2
]
×
.
.
.
×
d
[
s
u
m
]
k
[
s
u
m
]
N=d[1]^{k[1]}\times d[2]^{k[2]}\times ... \times d[sum]^{k[sum]}
N=d[1]k[1]×d[2]k[2]×...×d[sum]k[sum]
然后可以得到
N
M
=
d
[
1
]
k
[
1
]
×
M
×
d
[
2
]
k
[
2
]
×
M
×
.
.
.
×
d
[
s
u
m
]
k
[
s
u
m
]
×
M
N^M=d[1]^{k[1]\times M}\times d[2]^{k[2]\times M}\times ... \times d[sum]^{k[sum]\times M}
NM=d[1]k[1]×M×d[2]k[2]×M×...×d[sum]k[sum]×M
之后就打表(别怪我蒟蒻太菜)
N N N \ M M M | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|
2 | 3 | 7 | 15 | 31 | 63 |
3 | 4 | 13 | 40 | 121 | 364 |
4 | 7 | 31 | 127 | 511 | 2047 |
5 | 6 | 31 | 156 | 781 | 3906 |
6 | 12 | 91 | 600 | 3751 | 22932 |
可以发现,对于
N
N
N是质数,有
a
n
s
(
N
,
M
)
=
N
m
+
N
m
−
1
+
N
m
−
2
+
.
.
.
+
N
1
+
1
ans(N,M)=N^m+N^{m-1}+N^{m-2}+...+N^1+1
ans(N,M)=Nm+Nm−1+Nm−2+...+N1+1
对于
N
N
N是合数,有
a
n
s
(
N
,
M
)
=
a
n
s
(
d
[
x
]
,
k
[
x
]
×
M
)
×
a
n
s
(
d
[
y
]
,
k
[
y
]
×
M
)
.
.
.
ans(N,M)=ans(d[x],k[x]\times M)\times ans(d[y],k[y]\times M)...
ans(N,M)=ans(d[x],k[x]×M)×ans(d[y],k[y]×M)...
然后加上一个逆元即可。
代码:
#include <cstdio>
#include <iostream>
#define N 500
#define MOD 9901
#define ll long long
using namespace std;
int sum;
ll n,m,d[N],k[N];
ll ksm(ll x,ll y)
{
ll ans=1;
x%=MOD;
while (y)
{
if (y&1) ans=(ans*x)%MOD;
y>>=1;
x=(x*x)%MOD;
}
return ans;
}
ll S(ll x,ll y)
{
ll ans=1;
if (!((x-1)%MOD))
return y+1;
ll inx=ksm(x-1,MOD-2);
ll k=(ksm(x,y+1)+MOD-1)%MOD;
ans=k*inx%MOD;
return ans;
}
int main()
{
cin>>n>>m;
for (ll i=2;i*i<=n;i++) //分解质因数
while (!(n%i))
{
if (d[sum]!=i) d[++sum]=i;
k[sum]++;
n/=i;
}
if (n>1)
{
d[++sum]=n;
k[sum]++;
}
ll ans=1;
for (int i=1;i<=sum;i++)
ans=ans*S(d[i],k[i]*m)%MOD;
cout<<ans%MOD<<"\n";
return 0;
}