1.题目描述:点击打开链接
2.解题思路:本题要求寻找最小的B,使得lcm(A,B)=C。这里容易想当然地认为B=C/A就是答案。实际上是错误的做法。因为lcm(A,C/A)不一定等于C,如果想让lcm(A,C/A)==C,必须有gcd(A,C/A)==1。通过恒等式a*b==gcd(a,b)*lcm(a,b)即可证明。这就提示我们得到临时的B之后,要想办法将A,B变为互素的两个数。还是利用恒等式,我们可以事先求出d=gcd(A,B),只需要B*=d,同时将A/=d。即可消去两者公共的倍数,同时还可以保证A*B是一个定值。不过这里又要注意了:不可以只消去一次就以为gcd(A,B)=1了,要一直反复多次尝试,直到gcd(A,B)==1为止。
3.代码:
<span style="color:#000000;">#define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<algorithm> #include<string> #include<sstream> #include<set> #include<vector> #include<stack> #include<map> #include<queue> #include<deque> #include<cstdlib> #include<cstdio> #include<cstring> #include<cmath> #include<ctime> #include<functional> using namespace std; typedef long long ll; typedef unsigned long long ull; typedef pair<int, int> P; typedef pair<long long, long long> PL; #define me(s) memset(s,0,sizeof(s)) #define For(i,n) for(int i=0;i<(n);i++) int gcd(int a, int b) { return b == 0 ? a : gcd(b, a%b); } int main() { //freopen("t.txt", "r", stdin); int T; scanf("%d", &T); while (T--) { int a, b, c; scanf("%d%d", &a, &c); if (c%a == 0) { b = c / a; int d = gcd(a, b); while (d != 1)//要写成循环的形式 { b *= d; a /= d; d = gcd(a, b); } printf("%d\n", b); } else puts("NO SOLUTION"); } return 0; }</span>
原文地址:http://blog.csdn.net/u014800748/article/details/45871807