这道题之前做过比这个难的,但是今天这个感觉自己傻了
解题思路:
- 可以更暴力,不过我这里采用了别的手段(方法)
- 就是x, y两个数可以表示成c * i , c * j, c是他们的最大公约数,所以i, j是互质的,然后我们可以求出c就是x, 那么ijx 就是y,所以我们如果知道i 就会知道 j ,所以我们遍历,然后找 j 就OK
- 这里需要注意的是m%n 可能不是 0,这里是我傻了
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int gcd(int a,int b){
if (a > b){
int temp = a;
a = b;
b = temp;
}
while(b%a!=0){
int temp = b%a;
b = a;
a = temp;
}
return a;
}
int main(){
int n, m;
while(scanf("%d%d",&n,&m) != EOF){
if (m % n != 0){
puts("0");
continue;
}
int k = m / n;
int res = 0;
for (int i = 1; i < 1000010; i++){
if (k % i == 0){
int t = k/ i;
if(gcd(i , t) == 1){
res ++;
}
}
}
printf("%d\n",res);
}
return 0;
}