您的位置:首页 > 其它

[HDU 2841]Visible Trees:容斥原理

2017-04-12 16:57 447 查看
点击这里查看原题

一个点能被看见的条件是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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: