题目大意:
题目链接:https://jzoj.net/senior/#main/show/5340
题目图片:
http://wx2.sinaimg.cn/mw690/0060lm7Tly1fwepmh2hffj30jp0cwac2.jpg
http://wx4.sinaimg.cn/mw690/0060lm7Tly1fwepmh2vacj30jq0e8mxt.jpg
求的因子和。
思路:
首先把分解质因数,那么可以得到
然后可以得到
之后就打表(别怪我蒟蒻太菜)
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 |
可以发现,对于是质数,有
对于是合数,有
然后加上一个逆元即可。
代码:
#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<<"
";
return 0;
}