题目地址:https://codeforces.com/contest/1228/problem/C
题意:有一个数x,其素因子{p1,p2...pn},g(x,n)表示x可以整除的最大的p的整数幂,即p的k次方。f(x,n)=g(n,p1)*g(n,p2)*...*g(n,pn)。求f(x,1)*f(x,2)*...f(x,n)。
思路:先找出x的各个素数因子,再在n中找出p有的的次数,n/p,一遍之后,继续(n/p)/p,循环,直到得到的数小于p,得到出现次数,接下来就是快速幂的操作了。再将所有的p计算,结果累乘就是答案了。
AC代码:
1 #include <iostream> 2 #include <cstdio> 3 using namespace std; 4 typedef long long ll; 5 const ll mod=1e9+7; 6 ll n,m; 7 ll pre(ll a,ll b){ //快速幂 8 ll res=1; 9 while(b){ 10 if(b&1) res=res*a%mod; 11 a=a*a%mod; 12 b>>=1; 13 } 14 return res; 15 } 16 void sol(){ 17 ll ans=1; 18 for(ll i=2;i*i<=m;i++){ 19 if(! (m%i)){ 20 ll aa=i; 21 while(aa<=n){ //这里是找一次算一次 22 ans=ans*pre(i,n/aa)%mod; 23 aa=(n/aa>=i)?(aa*i):(n+1); 24 } 25 while(!(m%i)) m/=i; 26 } 27 } 28 if(m!=1){ //最后这里别忘了 29 ll aa=m; 30 while(aa<=n){ 31 ans=ans*pre(m,n/aa)%mod; 32 aa=(n/aa>=m)?(aa*m):(n+1); 33 } 34 } 35 cout<<ans<<endl; 36 } 37 int main(){ 38 cin>>m>>n; 39 sol(); 40 return 0; 41 }