[2001年NOIP普及组] 最大公约数和最小公倍数问题
[2001年NOIP普及组] 最大公约数和最小公倍数问题
题目描述:输入二个正整数x0,y0(2<=x0<100000,2<=y0<=1000000),求出满足下列条件的P,Q的个数
条件:
1.P,Q是正整数
2.要求P,Q以x0为最大公约数,以y0为最小公倍数.
试求:满足条件的所有可能的两个正整数的个数.
他还良心的解释了一下样例
输入:x0=3 y0=60
输出:4
说明(不用输出)此时的P Q分别为:
3 60
15 12
12 15
60 3
所以:满足条件的所有可能的两个正整数的个数共4种.
这道题确实做了很久,这道题暴力可以过,但是也可以用数学方法,利用唯一分解定律,最大公约数的次数都是取min,最小公倍数的次数都是取max,如果次数不同,证明这一位的贡献值是2,两个数一个取max,一个取min,就好了,如果次数相等,就没有贡献。在处理前先判断一下最大公约数能不能整除最小公倍数.看了讲解视频,我稍微修改了一下代码,终于是过了。代码如下:
#include<bits/stdc++.h> using namespace std; int m,n,num,ans; int gys(int a,int b) { if(a%b==0) return b; else return gys(b,a%b); } int main() { cin>>m>>n; num=m*n; if(m==n) ans--; for(int i=1;i<=sqrt(num);i++) { if(num%i==0&&gys(i,num/i)==m) ans+=2; } cout<<ans; return 0; }