题目大概是这种:
大意就是 求出全部的正整数对 使他们最大公约数为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#include #include #include #include #include #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;}