UVA 11889 - Benefit 可直接枚举

看题传送门

题目大意:

输入两个整数A和C,求最小的整数B,使得lcm(A,B)=C。如果无解,输出NO SOLUTION

思路:

A*B=C*gcd(A,B)

所以 B / gcd(A,B) = C / A

如果C / A不是整数,那么就无解。

不然B 一定是C / A 的整数倍。(都是整数嘛)


#include<cstdio>
int gcd(int a,int b)
{
	return b==0?a:gcd(b,a%b);
}
int main()
{
	int T;
	scanf("%d",&T);
	while(T--)
	{
		int a,c,ans;
		scanf("%d%d",&a,&c);
		bool ok=false;
		if(c%a==0)
		{
			int target=c/a;
			for(int i=target;i<=c;i+=target)
			{
				if(i/gcd(i,a)==target)
				{
					ok=true;
					ans=i;
					break;
				}
			}
		}
		if(ok)
			printf("%d\n",ans);
		else printf("NO SOLUTION\n");
	}
}

这个方法多久呢?

12180501 11889 Benefit Accepted C++ 0.605 2013-08-08 14:55:25

嗯,觉得太慢了?还有更快的!

 B / gcd(A,B) = C / A 对于B,每次多/了个最大公约数,我们把它*回去,并把A缩小 ,(就是说把B扩大他们的公约数倍,A缩小,当他们的公约数为1的时候就是说LCM(A,B)=A*B)

详见代码:


12180487 11889 Benefit Accepted C++ 0.062 2013-08-08 14:52:08

#include<cstdio>
int gcd(int a,int b)
{
	return b==0?a:gcd(b,a%b);
}
int main()
{
	int T;
	scanf("%d",&T);
	while(T--)
	{
		int a,c,ans;
		scanf("%d%d",&a,&c);
		bool ok=false;
		if(c%a!=0)
			printf("NO SOLUTION\n");
		else
		{
			int b=c/a;
			int temp;
			do
			{
				temp=gcd(b,a);
				b*=temp;
				a/=temp;
			}
			while(temp!=1);
			printf("%d\n",b);
		}

		
		
	}
}


posted @ 2013-08-08 22:47  hr_whisper  阅读(153)  评论(0编辑  收藏  举报