WOJ1420-可见点

来源:互联网 发布:c语言字符串大小写转换 编辑:程序博客网 时间:2024/05/16 07:53

平面上有m*n个整点,他们的坐标(x, y)满足1<=x<=m, 1<=y<=n, x,y都是整数。求从原点能看到的点的数量(如果某点与原点的连线上没有其他点,则该点能被原点看到)。 

输入格式

第一行一个数t(1<=t<=15),表示数据的组数 以下每组数据一行,每行两个数m,n(0<=m, n<=50000)

输出格式

对于每组数据,输出能被原点看到的点的总数

样例输入

21 12 3

样例输出

15



#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);elseAns += (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';}}