題意:求有多少對 \((a,b)\) 滿足 \(b \times \gcd(a,b) \equiv 0 \pmod{a+b},1 \le a \le n,1 \le b \le m\)。
首先我們設 \(\gcd(a,b) = G,a=i \times G,b = j \times G\),顯然有 \(\gcd(i,j)=1\)。
那麼可以把原條件轉化為 \(j \times G\) 是 \((i+j)\) 的倍數。因為 \(\gcd(i+j,j)=1\),所以 \(G\) 是 \((i+j)\) 的倍數。又因為 \(1 \le a=i\times G \le n,1 \le b=j \times G \le m\),所以 \(i \le \sqrt{n},j \le \sqrt{m}\)。於是我們可以列舉每一對合法的 \((i,j)\),若 \(\gcd(i,j)=1\),那麼它的貢獻為 \(\min(n / i / (i + j),m / j / (i + j))\)。時間複雜度 \(O(\sqrt{n} \times \sqrt{m} \times \log n)=O(n \log n)\)。
#include<bits/stdc++.h>
using namespace std;
#define int long long
int T,n,m;
signed main() {
cin >> T;
while(T--) {
cin >> n >> m;
int ans = 0;
for(int i = 1;i <= sqrt(n);i++) {
for(int j = 1;j <= sqrt(m);j++) {
if(__gcd(i,j) != 1) continue;
ans += min(n / i / (i + j),m / j / (i + j));
}
} cout << ans << endl;
}
return 0;
}