【洛谷】P1029 [NOIP2001 普及组] 最大公约数和最小公倍数问题
最小 洛谷 普及 最大公约数 公倍数 问题
2023-09-14 09:13:20 时间
1. 题目
P1029 最大公约数和最小公倍数问题
2. 思想
- 定一个
gcd()
函数,用于取两个数的最大公约数 - 两重for循环遍历,找出合适的值即可
注意for
循环的边界问题,i/j
的step可以调成 最大公约数,同时其二者的上界都可以写为sqrt(x *y)
。如果单纯的写成i<=y
会导致TLE
错误。
其实两重 for
循环的复杂度还是欠妥,可以优化成 O(n)。 => 这类问题都可以简化成,如果两个变量存在关联,那么我们就得考虑是否只要控制其中一个变量即可讨论完成了?
3. 代码
#include<iostream>
#include<cmath>
using namespace std;
typedef long long ll;
//求a,b的最大公约数
int gcd(int a,int b){
int remain = a;
while(remain){
remain = a%b;
a = b;
b = remain;
}
return a;
}
int main(){
ll x ,y ;
cin >> x >> y; //输入两个数
int res = 0;
int flag = 0;
//1.该数的范围一定不会超过最小公倍数y
ll prod = x * y;
for (int i = x;i<= sqrt(prod);i+=x){ //2.可以修改step
for (int j = y;j>=sqrt(prod);j-=x){
int a = gcd(i,j);
ll b = j*i/a; //求出最大公约数
if( a == x && b==y){
if (i == j) flag = 1;
res++;
}
}
}
cout << res * 2 - flag ;
}
相关文章
- 【方法3:Perl版本】删除Map中Value重复的记录,并且只保留Key最小的那条记录
- Java实现 LeetCode 111 二叉树的最小深度
- java实现平面点最小距离
- Leetcode0910. 最小差值 II(medium)
- 习题 8.10 将一个5*5的矩阵中最大的元素放在中心,4个角分别放4个最小的元素(顺序为从左到右,从上到下依次从小到大存放),写一函数实现之。用main函数调用。
- Leetcode 1509. 三次操作后最大值与最小值的最小差(有点意思,做出来了)
- NC119 最小的K个数
- Python游戏开发入门:pygame最小开发框架-1
- 【搜索引擎】ES DSL中最小粒度的clause是什么?query 和 filter 有什么区别?
- UVA 1201 - Taxi Cab Scheme(二分图匹配+最小路径覆盖)
- 求最小公倍数
- hdu1171(DP求两份物品的价值相差最小)
- 交替最小二乘ALS