首页 > 其他 > 详细

Codeforces Round #589 (Div. 2) C. Primes and Multiplication

时间:2019-10-11 21:26:30      阅读:77      评论:0      收藏:0      [点我收藏+]

题目地址: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 }

 

Codeforces Round #589 (Div. 2) C. Primes and Multiplication

原文:https://www.cnblogs.com/xunzf0402/p/11656787.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!