先让你计算k:
这个主要是算k,后面那个比较难看的取模可以百度指数循环节。
关于计算k,:
对于第一种情况,我们根据欧拉函数的积性,有:
#include
#include
#include
#define mod 1000000007
#define maxn 10000005
#define LL long long
using namespace std;
int prime[maxn],cnt,phi[maxn],fac[50],nfac;
LL pre[maxn],n,m,p;
bool vis[maxn];
void setup(int high)
{
cnt=0;
phi[1]=1;
for (int i=2;i<=high;i++)
{
if (!vis[i])
{
prime[cnt++]=i;
phi[i]=i-1;
}
for (int j=0;j1;
if (i%prime[j]) phi[i*prime[j]]=phi[i]*(prime[j]-1);
else
{
phi[i*prime[j]]=phi[i]*prime[j];
break;
}
}
}
for (int i=1;i<=high;i++) pre[i]=(pre[i-1]+phi[i])%mod;
}
LL pow_mod(LL a,LL b,LL c)
{
LL ans=1;
while (b)
{
if (b&1) ans=(ans*a)%c;
b>>=1;
a=(a*a)%c;
}
if (ans==0) ans+=c;
return ans;
}
LL dfs(LL n,LL m,int depth)
{
if (m==0) return 0;
if (n==1) return pre[m];
//if (m==1) return phi[n];
return (dfs(n/fac[depth],m,depth+1)*phi[fac[depth]]%mod+dfs(n,m/fac[depth],depth))%mod;
}
void deal(int n)
{
memset(fac,0,sizeof(fac));
nfac=0;
for(int i=0;iif(!vis[n])
{
fac[nfac++]=n;
break;
}
if(n%prime[i]==0)
{
fac[nfac++]=prime[i];
n/=prime[i];
}
}
}
LL ans(LL k,LL t)
{
if (t==1) return 1;
LL c=ans(k,phi[t]);
return pow_mod(k,c,t);
}
int main()
{
setup(maxn-5);
while (scanf("%I64d%I64d%I64d",&n,&m,&p)!=EOF)
{
deal(n);
LL k=dfs(n,m,0);
printf("%I64d\n",ans(k,p));
}
return 0;
}