一个萌新的成长之路
Discription
- 输入二个正整数x0,y0(2<=x0<100000,2<=y0<=1000000),求出满足下列条件的P,Q的个数
条件:
1.P,Q是正整数
2.要求P,Q以x0为最大公约数,以y0为最小公倍数.
试求:满足条件的所有可能的两个正整数的个数.
Input&Output
输入格式:
- 二个正整数x0,y0
输出格式:
- 一个数,表示求出满足条件的P,Q的个数
Example
Input:
3 60
Output:
4
Solution
- 本题并不难解,由于x为P,Q的最大公约数,所以枚举x的倍数即可。此外,又有两数的乘积除以其最大公约数等于其最小公倍数,得到判断条件。需要注意的是,由于类似3 60和60 3属于两组解,输出时应乘以2;
-
代码如下:
#include<iostream> #include<algorithm> using namespace std; int x, y, ans = 0; bool sig = true; int gcd(int a, int b) { if (a < b)swap(a, b); if (b == 0)return a; else return gcd(b, a%b); } void sch() { for (int i = 1;i*x <= y;i++)//枚举倍数 { for (int j = i;j*x <= y;j++) { if (i*x*j == y&&gcd(i, j) == 1)ans++;//这里做了点处理,i*x*j*x/x可以约去x. } } } int main() { ios::sync_with_stdio(false); cin>>x>>y; sch(); cout<<2*ans; return 0; }
-
然而本萌新意识到了一个问题:对于类似x=60 y=60的输入,应当只有一组解,实测却输出了2(尽管代码AC了),为了宇宙的和平与正义!瑟(wen)瑟(le)发(da)抖(lao)之后,得到了:
对于x==y的输入,有且仅有一组解满足条件。
-
于是,大概特判一发就可以了?
if(x==y)cout<<1,return 0;
Dec,09,2017 Sat