题意:求有多少对 \((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;
}
标签:le,gcd,int,题解,Hard,sqrt,times,Reverse
From: https://www.cnblogs.com/Creeperl/p/18169249