题解 UVa11889

题目大意 \(T\) 组数据,每组数据给定两个正整数 \(A,C\),求使 \(LCM(A,B)=C\) 的最小的 \(B\),若无解则输出NO SOLUTION。

分析\(C\%A=0\) 时有解。若有 \(LCM(A,B)=C\),则有 \(GCD(C/B,C/A)=1\)。令 \(m=C/B,B=C/m\),则问题转化为求最大的 \(m\),使 \(A\%m=0,GCD(m,C/A)=1\)。不难发现,\(m\) 最大即为 \(A\) 滤去所有 \(C/A\) 的因子。一种比较巧妙的做法是不断求 \(GCD(A,C/A)\),每次 \(A\) 除以 \(GCD(A,C/A)\)。当 \(GCD(A,C/A)=1\) 时,就已经完成了过滤。最后的答案即为每次 \(GCD\) 的积乘以 \(C/A\)

#include<bits/stdc++.h>
using namespace std;

int T, A, B, C, d, k;

int gcd(int a, int b)
{
	if(!b) return a;
	return gcd(b, a % b);
}

int main()
{	
	scanf("%d", &T);
	while(T--) {
		scanf("%d%d", &A, &C);
		if(C % A) { puts("NO SOLUTION"); continue; }
		
		B = C / A, k = 1;
		while((d = gcd(A, B)) != 1) k *= d, A /= d;
		printf("%d\n", B * k);
	}
}
posted @ 2019-10-25 23:20  whx1003  阅读(137)  评论(0编辑  收藏  举报