GT and numbers
Accepts: 47
Submissions: 939
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 65536/65536 K (Java/Others)
问题描述
给出两个数N和M。 N每次可以乘上一个自己的因数变成新的N。 求最初的N到M至少需要几步。 如果永远也到不了输出−1。
输入描述
第一行读入一个数T表示数据组数。 接下来T行,每行两个数N和M。 T≤1000, 1≤N≤1000000,1≤M≤263. 注意M的范围。hack时建议输出最后一行的行末回车;每一行的结尾不要输出空格。
输出描述
对于每组数据,输出一个数表示答案。
输入样例
3 1 1 1 2 2 4
输出样例
0 -1 1
感觉数学题都不会做了,连是用gcd求解都不知道。
AC代码:
#include<iostream> #include<algorithm> #include<cstring> #include<cstdio> #include<queue> using namespace std; #define T 100 #define eps 1e-10 typedef unsigned long long ll; ll gcd(ll a,ll b) { return a%b==0?b:gcd(b,a%b); } int main() { /* freopen("input.txt","r",stdin); */ ll N,n,m,k,ans; scanf("%I64d",&N); while(N--) { scanf("%I64d%I64d",&n,&m); ans=0; if(n==m){ printf("0\n"); continue; } while(n!=m) { if(m%n){ printf("-1\n");break; } k = gcd(m/n,n); if(k==1){ printf("-1\n");break; } n*=k,ans++; } if(n==m) printf("%I64d\n",ans); } return 0; }