题目描述
输入二个正整数x0,y0(2<=x0<100000,2<=y0<=1000000),求出满足下列条件的P,Q的个数
条件:
1.P,Q是正整数
2.要求P,Q以x0为最大公约数,以y0为最小公倍数.
试求:满足条件的所有可能的两个正整数的个数.
输入输出格式
输入格式:
二个正整数x0,y0
输出格式:
一个数,表示求出满足条件的P,Q的个数
输入输出样例
输入样例#1:
3 60
输出样例#1:
4
说明
P,Q有4种
3 60 15 12 12 15 60 3
分析:暴力可以过,但是也可以用数学方法,利用唯一分解定律,最大公约数的次数都是取min,最小公倍数的次数都是取max,如果次数不同,证明这一位的贡献值是2,两个数一个取max,一个取min,就好了,如果次数相等,就没有贡献。在处理前先判断一下最大公约数能不能整除最小公倍数.
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath> using namespace std; int x,y,cnt; int qpow(int a,int b)
{
int ans = ;
while (b)
{
if (b & )
ans *= a;
a *= a;
b >>= ;
}
return ans;
} int main()
{
scanf("%d%d",&x,&y);
if (y % x != )
printf("0\n");
else
{
int k = y / x;
for (int i = ; i <= k; i++)
{
if (k % i == )
{
while (k % i == )
k /= i;
cnt++;
}
}
printf("%d\n",qpow(,cnt));
} return ;
}