[luoguP1072] Hankson 的趣味题(数论)

传送门

由题意得

  • gcd(x, a0) = a1 ——> gcd(x / a1, a0 / a1) = 1
  • lcm(x, b0) = b1 ——> x * b0 / gcd(x, b0) = b1 ——> gcd(x, b0) = x * b0 / b1 ——> gcd(b1 / b0, b1 / x) = 1

那么只需要枚举 b1 的因子并判断即可

#include <cstdio>
#include <iostream>

int n, a0, a1, b0, b1, ans;

inline int gcd(int x, int y)
{
	return !y ? x : gcd(y, x % y);
}

inline bool check(int x)
{
	return gcd(x / a1, a0 / a1) == 1 && gcd(b1 / b0, b1 / x) == 1;
}

int main()
{
	int i, j;
	scanf("%d", &n);
	while(n--)
	{
		scanf("%d %d %d %d", &a0, &a1, &b0, &b1);
		ans = 0;
		for(i = 1; i * i <= b1; i++)
			if(!(b1 % i))
			{
				if(!(i % a1)) ans += check(i);
				if((j = b1 / i) ^ i && !(j % a1)) ans += check(j);
			}
		printf("%d
", ans);
	}
	return 0;
}

 不知道为什么我枚举 a1 的倍数却不对

原文地址:https://www.cnblogs.com/zhenghaotian/p/7054312.html