题面:
给你两个正整数 n , m 。
请计算满足以下条件的有序数对 (a,b)的个数:
- 1≤a≤n , 1≤b≤m ;
- b⋅gcd(a,b) 是 $ a+b $ 的倍数。
输入
每个测试包含多个测试用例。第一行包含测试用例的数量 t ( 1≤t≤104 )。( 1≤t≤104 ).测试用例说明如下。
每个测试用例的第一行包含两个整数n , m ( 1≤n,m≤2⋅106)。
保证所有测试用例中 n 和 m 的总和不超过 2⋅106 。
输出
为每个测试用例打印一个整数:有效配对的数量。
分析:
b∗gcd(a,b)=k∗(a+b)不妨设gcd(a,b)=d,则a=p∗d,b=q∗d源式化为(q+p)∣qd=k因为gcd(p,q)=gcd(p+q,q)=1可得(q+p)∣d=k因为1≤q≤m&q≤d,则q≤m,同理p≤m则可以两层n,m,循环暴力枚举p,q,用gcd(p,q)作为满足条件对答案的贡献为ans+=(p+q)min(pn,qm)时间复杂度:O(n⋅m∗logn)
代码:
void solve(){
int n,m;cin>>n>>m;
int ans=0;
for(int i=1;i<=n/i;i++){
for(int j=1;j<=m/j;j++){
if(__gcd(i,j)==1)
ans+=min(n/i,m/j)/(i+j);
}
}
}