题目大概是这样的:点击打开链接
大意就是 求出所有的正整数对 使他们最大公约数为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 2000005
typedef 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;
}