平面上有m*n个整点,他们的坐标(x, y)满足1<=x<=m, 1<=y<=n, x,y都是整数。求从原点能看到的点的数量(如果某点与原点的连线上没有其他点,则该点能被原点看到)。
输入格式
第一行一个数t(1<=t<=15),表示数据的组数 以下每组数据一行,每行两个数m,n(0<=m, n<=50000)
输出格式
对于每组数据,输出能被原点看到的点的总数
样例输入
2 1 1 2 3
样例输出
1 5
#include<iostream>
#include<vector>
using namespace std;
int N,M;
int Ans;
vector<int> F;
void Dfs(int Step,int Frac,int Tot) {
if(Step >= F.size()) {
if(Tot&1)
Ans -= (long long)(M/Frac);
else
Ans += (long long)(M/Frac);
return;
}
Dfs(Step+1,Frac*F[Step],Tot+1);
Dfs(Step+1,Frac,Tot);
}
void Count(int Num) {
int Cur = Num;
F.clear();
for(int i=2; i*i<=Num; i++)
if(Cur%i == 0) {
F.push_back(i);
while(Cur%i == 0)
Cur /= i;
}
if(Cur > 1) F.push_back(Cur);
Dfs(0,1,0);
}
int main() {
int n ;
cin >> n ;
while(n--) {
Ans = 0;
cin >>M>>N;
for(int i=1; i<=N; i++)
Count(i);
cout<<Ans<<'\n';
}
}