【*1700质因子分解】CF1538D

た 入场券 2024-03-22 20:16 164阅读 0赞

Problem - D - Codeforces

题意:

给定两个数a和b,每次操作可以在两个数中选一个数然后除它的一个因子,问你是否可以进行正好K次操作之后a和b相同

da3cbd268c824f7f9d957b6119c258c0.png

36f4d8e1b99c45a8aa15199a7cef02ba.png

思路:

可以模拟一下小样例:

36=2^2*3^2

48=2^4*3^1

可以发现,最多操作次数是(2+2+4+1)

最少操作次数呢?那就是变成a和b的gcd的次数

设最大次数为max,最少次数为min

然后可以发现,我们可以操作[min,max]内的任意次数(这个稍微想一下即可)

因此就变成判断max<=K了

对于K=1的情况需要特判

Code:

  1. #include <bits/stdc++.h>
  2. #define int long long
  3. using namespace std;
  4. const int mxn=1e5+10;
  5. const int mxe=1e6+10;
  6. const int mod=1e9+7;
  7. const int Inf=0x3f3f3f3f;
  8. int N,a,b,k;
  9. int len=0;
  10. int prime[mxn],vis[mxn];
  11. int calc(int x){
  12. int res=0;
  13. for(int i=1;i<=len;i++){
  14. int p=prime[i];
  15. if(x%p==0){
  16. while(x%p==0){
  17. x/=p;
  18. res++;
  19. }
  20. }
  21. }
  22. if(x!=1) res++;
  23. return res;
  24. }
  25. void P_init(int n){
  26. for(int i=2;i<=n;i++){
  27. if(!vis[i]) prime[++len]=i;
  28. for(int j=1;i<=n/prime[j];j++){
  29. vis[i*prime[j]]=1;
  30. if(i%prime[j]==0) break;
  31. }
  32. }
  33. }
  34. void solve(){
  35. cin>>a>>b>>k;
  36. if(k==1){
  37. if(a==b){
  38. cout<<"NO"<<'\n';
  39. return;
  40. }else if(a%b==0||b%a==0){
  41. cout<<"YES"<<'\n';
  42. return;
  43. }else{
  44. cout<<"NO"<<'\n';
  45. return;
  46. }
  47. }
  48. if(calc(a)+calc(b)>=k) cout<<"YES"<<'\n';
  49. else cout<<"NO"<<'\n';
  50. }
  51. signed main(){
  52. ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  53. int __=1;cin>>__;
  54. P_init(1e5);
  55. while(__--)solve();return 0;
  56. }

发表评论

表情:
评论列表 (有 0 条评论,164人围观)

还没有评论,来说两句吧...

相关阅读

    相关 因子分解

    概念:所谓质因子分解是将一个正整数n写成一个或多个质数的乘积形式。 例如:6=2\3,180=2\2\3\3\5,也可以写成指数形式,例如 180=2^2\3^2\5^1;