题目来源:https://codeforces.com/contest/1228/problem/C
赛中一直没调出来之后题目有个地方误解了,最近比赛老暴毙。
直接对x进行分解,唯一分解定律,之后找到f与g函数的关系,可以发现直接对素因子进行操作和求n中得次数即可。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<vector>
#include<algorithm>
#include<queue>
#define MAX_len 50100*4
using namespace std;
typedef long long ll;
const int MAX=1e6+10;
const int mod=1e9+7;
ll prime[MAX],c[MAX];
int m=0;
void fj(ll x)
{
ll i,j;
ll len=sqrt(x);
for(i=2;i<=len;i++)
{
if(x%i==0)
{
prime[++m]=i,c[m]=0;
while(x%i==0)
{
x/=i;
c[m]++;
}
}
}
if(x>1)
prime[++m]=x,c[m]=1;
}
ll quickpow(ll a,ll n)
{
ll res=1;
while(n)
{
if(n&1)
res=(res*a)%mod;
n>>=1;
a=(a*a)%mod;
}
return res%mod;
}
ll solve(ll n,ll hh)
{
ll res=0;
ll sum=0;
while(n)//赛中把这里直接误解为前N项和了,前提是得整除的最大幂数。其实就是找多少个2,与求n阶乘中的尾部0个数找5的个数一样的
{
res+=n/hh;
n/=hh;
}
return quickpow(hh,res);
}
int main()
{
ll x,n,i,j;
scanf("%I64d %I64d",&x,&n);
fj(x);
ll ans=1;
for(i=1;i<=m;i++)
{
ll temp=1;
temp=solve(n,prime[i]);
ans=ans*temp%mod;
}
printf("%I64d",ans);
return 0;
}