求出所有的正整数对 使他们最大公约数为n,最小公倍数为m

题目大概是这样的:点击打开链接

大意就是 求出所有的正整数对 使他们最大公约数为n,最小公倍数为m。(1 <= n, m <= 10^10)

可以将问题转化为:设a,b就是那个整数对,,n, a, b, m,这4个数都是可以被n整除的,可以都除以n,题目转化为求出最大公约数为1,最小公倍数为m/n的对数。

也就是求出在1到m/n里乘积为m/n且互质的对数。可以在O(sqrt (m/n) )内解决。

#include <algorithm>#include <cstdio>#include <cmath>#include <cstring>#include <cstdlib>#include <iostream>#define MAX 0x3f3f3f3f#define N 2000005typedef long long LL;using namespace std;int T;LL n, m;LL gcd(LL a, LL b) {return b == 0 ? a : gcd(b, a % b);}int main(){cin>>T;while(T–) {cin >> n >> m;if(m % n) {printf("0\n");continue;}LL x = m / n;int ans = 0;for(LL i = 1; i <= (LL)sqrt(x); i++) {if(x % i == 0) {LL j = x / i;if(gcd(i, j) == 1) ans++;}}printf("%d\n", ans);}return 0;}



积极的人在每一次忧患中都看到一个机会,而消极的人则在每个机会都看到某种忧患。

求出所有的正整数对 使他们最大公约数为n,最小公倍数为m

相关文章:

你感兴趣的文章:

标签云: