CF1967B2 Reverse Card (Hard Version) 题解

题意:求有多少对 \((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;
}
posted @ 2024-05-01 12:40  Creeper_l  阅读(35)  评论(0编辑  收藏  举报