题目大概是这种:点击打开链接
大意就是 求出全部的正整数对 使他们最大公约数为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 "); 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 ", ans); } return 0; }