UVA 11889 - Benefit 可直接枚举
2013-08-08 22:47
295 查看
看题传送门
题目大意:
输入两个整数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 的整数倍。(都是整数嘛)
这个方法多久呢?
嗯,觉得太慢了?还有更快的!
B / gcd(A,B) = C / A 对于B,每次多/了个最大公约数,我们把它*回去,并把A缩小 ,(就是说把B扩大他们的公约数倍,A缩小,当他们的公约数为1的时候就是说LCM(A,B)=A*B)
详见代码:
题目大意:
输入两个整数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); } } }
相关文章推荐
- UVA 11889 - Benefit 可直接枚举
- UVA 11889-Benefit(数学_快速枚举因子)
- UVA 11889 Benefit
- UVa11889 - Benefit
- UVA-11889 Benefit
- UVA11889 - Benefit
- uva 11889 - Benefit
- UVa 11889 Benefit(数论)
- UVA 11889 Benefit
- uva 131 The Psychic Poker Player(直接枚举)
- UVa11889 Benefit
- UVA 11889 - Benefit(数论)
- UVA11889 Benefit
- UVa 11889 Benefit
- UVa 11889 - Benefit
- uva 11889 - Benefit(数论)
- UVA - 11889 Benefit
- UVA 11889 Benefit——gcd
- uva 11889 Benefit
- UVA11889:Benefit(已知LCM和其中一个数,求另一个数)