1. 程式人生 > >【JZOJ5340】春思【數論,數學】

【JZOJ5340】春思【數論,數學】

題目大意:

思路:

首先把NN分解質因數,那麼可以得到 N=d[1]k[1]×d[2]k[2]×...×d[sum]k[sum]N=d[1]^{k[1]}\times d[2]^{k[2]}\times ... \times d[sum]^{k[sum]} 然後可以得到 NM=d[1]k[1]×M×d[2]k[2]×M×...×d[sum]k[sum]×MN^M=d[1]^{k[1]\times M}\times d[2]^{k[2]\times M}\times ... \times d[sum]^{k[sum]\times M}

之後就打表(別怪我蒟蒻太菜)

NN \ MM 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

可以發現,對於NN是質數,有ans(N,M)=Nm+Nm1+Nm2+...+N1+1ans(N,M)=N^m+N^{m-1}+N^{m-2}+...+N^1+1

1 對於NN是合數,有ans(N,M)=ans(d[x],k[x]×M)×ans(d[y],k[y]×M)...ans(N,M)=ans(d[x],k[x]\times M)\times ans(d[y],k[y]\times 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; }