分解质因子:求n的所有质因数
for(int i=2;i*i<=x;++i){
if(x%i==0){
while(x%i==0) x/=i;
num[++cnt]=i;
}
}
阶乘分解质因子:
比如求9!中质因子的个数:
2的个数=9/2+9/ ( 2 2 ) (2^2) (22)+9/ ( 2 3 ) (2^3) (23)=4+2+1=7
因为
包含因子 2:2,4,6,8:fac[2]+=4(此时4和8仅记录第一个因子2)
包含因子 2 2 2^2 22:4,8:fac[2]+=2 (此时4和8记录了第二个因子2)
包含因子 2 3 2^3 23:8:fac[2]+=1 (此时8记录第三个因子2)
所以因子2的个数等于4+2+1=7;
同理:
因为
包含因子 3:3,6,9:fac[3]+=3(此时9仅记录第一个因子3)
包含因子 3 2 3^2 32:9:fac[3]+=1 (此时9记录了第二个因子3)
所以因子3的个数等于9/3+9/ ( 3 2 ) (3^2) (32)=3+1=4;
long long tmp=n;
long long k=0;
while(tmp){
k+=tmp/num[i];
tmp/=num[i];
}
#include<bits/stdc++.h>
using namespace std;
const int mod=1e9+7;
int num[100010];
long long POW(long long x,long long y){
long long ans=1,tmp=x;
while(y){
if(y&1) ans=(ans*tmp)%mod;
tmp=(tmp*tmp)%mod;
y=y/2;
}
return ans;
}
int main(){
long long x,n;
scanf("%lld%lld",&x,&n);
int cnt=0;
for(int i=2;i*i<=x;++i){
if(x%i==0){
while(x%i==0) x/=i;
num[++cnt]=i;
}
}
if(x>1) num[++cnt]=x;
long long ans=1;
for(int i=1;i<=cnt;++i){
long long tmp=n;
long long k=0;
while(tmp){
k+=tmp/num[i];
tmp/=num[i];
}
ans=(ans%mod*POW(num[i],k)%mod)%mod;
}
printf("%lld",ans);
return 0;
}