[luoguP1029] 最大公约数和最小公倍数问题(数论)
生活随笔
收集整理的這篇文章主要介紹了
[luoguP1029] 最大公约数和最小公倍数问题(数论)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
傳送門
一.暴力枚舉(加了點優(yōu)化)
#include <cstdio>int x, y, ans;inline int gcd(int x, int y) {return !y ? x : gcd(y, x % y); }inline int lcm(int x, int y) {return x / gcd(x, y) * y; }int main() {int i, j;scanf("%d %d", &x, &y);for(i = x; i <= (y >> 1); i += x)for(j = i; j <= (y >> 1); j += x)if(gcd(i, j) == x && lcm(i, j) == y)ans++;for(i = x; i <= y; i += x)if(gcd(i, y) == x && !(y % i))ans++;ans <<= 1;printf("%d\n", ans);return 0; }二.降維
通過關(guān)系式
- x * y == gcd(x, y) * lcm(x, y)
可以枚舉 x,根據(jù)等式求 y
#include <cstdio>int x, y, ans;inline int gcd(int x, int y) {return !y ? x : gcd(y, x % y); }inline int lcm(int x, int y) {return x / gcd(x, y) * y; }int main() {int i, j;scanf("%d %d", &x, &y);for(i = x; i <= y; i++){j = x * y / i;if(gcd(i, j) == x && lcm(i, j) == y) ans++;}printf("%d\n", ans);return 0; }轉(zhuǎn)載于:https://www.cnblogs.com/zhenghaotian/p/7050192.html
總結(jié)
以上是生活随笔為你收集整理的[luoguP1029] 最大公约数和最小公倍数问题(数论)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 光大信用卡积分规则介绍 积分查询用这几招
- 下一篇: 如何用面对对象来做一个躁动的小球?