#P2694. 有序数对(困难版)[CF1967B2]

有序数对(困难版)[CF1967B2]

Description

[题意]

注意是和前一道题不一样的题意!

给你两个正整数$n, m$,统计满足以下性质的有序数对$(a, b)$的数量
1.$(1 \le a \le n)$,$(1 \le b \le m)$。
2.$b*gcd(a, b)$是$a+b$的倍数。

输入一个$T (1 \le T \le 10^4)$,是样例的组数。
接下来两个整数$n (1 \le n \le 2*10^6)$和$m (1 \le m \le 2*10^6)$。
在一组数据中$n$的和不超过$2*10^6$,$m$的和不超过$2*10^6$。

[样例输入]

6
1 1
2 3
3 5
10 8
100 1233
1000000 1145141

[样例输出]

0
1
1
6
423
5933961

[提示]

在第一组样例中:
没有符合条件的答案。
在第四组样例中:
有6组数对:$(2, 2), (3, 6), (4, 4), (6, 3), (6, 6), (8, 8)$。


Hint

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
LL gcd(LL x, LL y) {if(x==0) return y; else return gcd(y%x, x);}
int main(){
    //freopen("a.in", "r", stdin);
    int T; scanf("%d", &T);
    while(T--){
        LL n, m, ans=0; scanf("%lld%lld", &n, &m);
        for(LL i=1; i<=n/i; i++) for(LL j=1; j<=m/j; j++)
            if(gcd(i, j)==1) ans+=min(n/i, m/j)/(i+j);
        printf("%lld\n", ans);
    }
    return 0;
}