WOJ1420-可见点

平面上有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';
	}
}


猜你喜欢

转载自blog.csdn.net/lxq1071717521/article/details/77921655