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;
}
本文作者:Creeper_l
本文链接:https://www.cnblogs.com/Creeperl/p/18169249
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步