标签:main font 情况 number tip line style atom sam
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 2772 Accepted Submission(s):
688
题意:n要变到m,每次乘一个n的因子数,求最少乘几次
坑1:m需要用无符号long long定义
坑2:n的因子会变,变多变大
用r表示需要乘的总数,择优,每次选r和n的gcd,这样每次乘得多,次数就少,同时更新r和n
如果遇到r!=1,gcd=1证明需要乘的数 包含 n没有的因子,退出。
#include<stdio.h> #include<math.h> #include<string.h> #include<algorithm> #include<string> #include<vector> #include<iostream> #include<cstring> #define inf 0x3f3f3f3f using namespace std; #define ll unsigned long long const int p=10007; const int maxx=1e6+5; ll n,m;///坑1:无符号long long才放得下 int step; ll gcd(ll a,ll b) { if(b==0) return a; return gcd(b,a%b); } int main() { int t; scanf("%d",&t); while(t--) { cin>>n>>m; step=0; if(n==m) printf("0\n"); else if(n>m || m%n) printf("-1\n"); else { ll r=m/n;///r表示 n还要 乘 一个数 变成m ll d; bool flag=true; while(r!=1) { d=gcd(r,n); if(d==1)///出现这种情况,r!=1,和n没有共同因子,则表示m中含有n中不含有的质因子 { flag=false; break; } r=r/d; n=n*d;///坑2:每次n会变大,因子会更新 step++; } if(flag) cout<<step<<endl; else printf("-1\n"); } } return 0; }
hdu5505-GT and numbers-(贪心+gcd+唯一分解定理)
标签:main font 情况 number tip line style atom sam
原文地址:https://www.cnblogs.com/shoulinniao/p/10356993.html