【题解】
题意:
定义 为x的所有质因数的集合;
定义 为找到一个最大的整数
使得n能被
整除,
;
定义 为
,
;
给定x,n,要你输出 。
题解:
x有1e9,n有1e18,我们首先考虑到1e9范围内的数字最多有不超过10个素因数,所以先跑出x的素因数集合。然后我们考虑到对于每个p,只有当p能整除n时才对答案是有影响的,他可能是 ,否则一定为1。具体怎么影响呢?我们举个栗子:
对于x=3,n=45
显然质因数只有3,对于3在范围内有影响的部分是所有的3的倍数,即有45/3=15个;
对于3^2的有45/9=5个;对于3^3的有45/27=1个;
所以答案就是 对
取模。
【代码】
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+10;
const ll mod=1e9+7;
ll fac[100];
int cnt=0;
void init(ll x)
{
for(ll i=2;i*i<=x;i++){
if(x%i==0) fac[cnt++]=i,x/=i;
while(x%i==0) x/=i;
}
if(x>1) fac[cnt++]=x;
}
ll qpow(ll a,ll b)
{
ll ret=1;
while(b){
if(b&1) ret=ret*a%mod;
a=a*a%mod;
b>>=1;
}
return ret;
}
int main()
{
ll x,n; scanf("%lld%lld",&x,&n);
init(x);
ll ans=1;
for(int i=0;i<cnt;i++){
ll p=fac[i];
//printf("p=%d\n",p);
if(n<p) break;
ll tmp=1;
int k=0;
while(tmp<=n/p){
tmp*=p;
ans=ans*(qpow(p,n/tmp))%mod;
//printf("k=%d,tmp=%lld\n",++k,tmp);
}
}
printf("%lld\n",ans);
return 0;
}