UVa 11889 Benefit(数论)

题目链接: 传送门

Benefit

Time Limit: 5000MS     Memory Limit: 32768 KB

Description

Recently Yaghoub is playing a new trick to sell some more. When somebody gives him A Tomans, he
who never has appropriate changes, asks for B Tomans such that lowest common multiple of A and B
equals to C and he will pay back a round bill. Or otherwise take some snack instead of the remaining of
his money. He believes that finding such a number is hard enough that dissuades students from paying
that.
You should write a program that help poor students giving the appropriate amount of money to
Yaghoub. Of course if there are several answers you go for students’ benefit which is the lowest of them.

Input

The first line begin with an integer T (T ≤ 100000), the number of tests. Each test that comes in a separate line contains two integers A and C (1 ≤ A, C ≤ 107).

Output

Print the lowest integer B such that LCM(A, B) = C in a single line. If no such integer exists, print
‘NO SOLUTION’ instead. (Quotes for clarity)

Sample Input

3
2 6
32 1760
7 16

Sample Output

3
55
NO SOLUTION

解题思路:

题目大意:给出A、C,为你A与哪个数的最小公倍数是C。
其实就是欧几里得的应用,若C不是A的整数倍,直接跳出,若是,看一下A,C/A的最大公因数是不是1,如果不是继续跑欧几里得。

#include<iostream>
#include<cstdio>
using namespace std;

int gcd(int a,int b)
{
	return b == 0?a:gcd(b,a%b);
}

int main()
{
	int T,A,B,C;
	scanf("%d",&T);
	while (T--)
	{
		scanf("%d%d",&A,&C);
		if (C % A == 0)
		{
			B = C/A;
			int tmp = gcd(A,B);
			if (tmp == 1)
			{
				printf("%d\n",C/A);
			}
			else
			{
				int res = 1;
				while (tmp != 1)
				{
					res *= tmp;
					A = A / tmp;  //如果改用B = B/tmp去做的话。。一直超时,不知道是数据的原因还是什么。没搞懂
					tmp = gcd(A,B);
				}
				printf("%d\n",res*B);
			}
		}
		else
		{
			printf("NO SOLUTION\n");
		}
	}
	return 0;
}
posted @ 2016-07-25 23:48  zxzhang  阅读(242)  评论(0编辑  收藏  举报