【JZOJ5340】春思【數論,數學】
阿新 • • 發佈:2018-12-16
題目大意:
思路:
首先把分解質因數,那麼可以得到
然後可以得到
之後就打表(別怪我蒟蒻太菜)
\ | 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<<"\n";
return 0;
}