CF1967B2 Reverse Card (Hard Version) 題解

Creeper_l發表於2024-05-01

題意:求有多少對 \((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;
}

相關文章