每日一题 — 2020 - 04 - 26

题目链接

这道题之前做过比这个难的,但是今天这个感觉自己傻了

解题思路:

  • 可以更暴力,不过我这里采用了别的手段(方法)
  • 就是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;
}
发布了121 篇原创文章 · 获赞 7 · 访问量 4300

猜你喜欢

转载自blog.csdn.net/LiangNiuMu/article/details/105762281
今日推荐