点击这里查看原题
一个点能被看见的条件是gcd(x,y)=1,因此,问题转化为n,m范围内有多少数对的gcd为1。
可以运用容斥原理,先求一个莫比乌斯函数,然后计算每一行的合法的数目。
/*
User:Small
Language:C++
Problem No.:5475
*/
#include<bits/stdc++.h>
#define ll long long
#define inf 999999999
using namespace std;
const int M=1e5+5;
int n,m,mu[M],prime[M],cnt;
ll ans;
bool np[M];
int main(){
freopen("data.in","r",stdin);//
ios::sync_with_stdio(false);
for(int i=2;i<=100000;i++){
if(!np[i]){
prime[++cnt]=i;
mu[i]=-1;
}
for(int j=1;j<=cnt&&prime[j]*i<=100000;j++){
np[i*prime[j]]=1;
if(i%prime[j]==0){
mu[i*prime[j]]=0;
break;
}
mu[i*prime[j]]=-mu[i];
}
}
int t;
cin>>t;
while(t--){
cin>>n>>m;
ans=(ll)n*m;
for(int i=2;i<=n;i++)
for(int j=i;j<=n;j+=i)
ans+=m/i*mu[i];
cout<<ans<<endl;
}
return 0;
}