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); } } }
新 blog : www.hrwhisper.me