hdu2841(容斥原理+分解质因数)Visible Trees

来源:互联网 发布:女士手套品牌 知乎 编辑:程序博客网 时间:2024/05/16 01:39
/*题目大意:在一个n*m的方格中一个人站在(0,0),每个方格都有树,求他能看到多少颗树设某点的坐标为(x,y),则求的是x/y的不同数目,那么问题就转换成了求两个区间内的互质的对数如果可以约分,那么他们约分后的互质在前面已经计算过了 */ //求区间[a,b]与[a,b]互质数多少对 #include<cstdio>#include<iostream>#include<vector>#define ll long longusing namespace std;const int mx=100005;int n,a,b;vector<int> x[mx];int vis[mx];void prime(){//预处理1~mx内的数的素因子 for(int i=2;i<mx;++i)if(!vis[i]){for(int j=i;j<mx;j+=i){vis[j]=1;x[j].push_back(i);}}}int solve(int a,int p){//求区间[1,a]与p互质的数的个数int ans=a;for(int i=1;i<(1<<x[p].size());++i){int cnt=0,k=1;for(int j=0;j<x[p].size();++j)if(i&(1<<j)) k*=x[p][j],++cnt;if(cnt&1) ans-=a/k;else ans+=a/k;}return ans;}int main(){prime();scanf("%d",&n);while(n--){scanf("%d%d",&a,&b);ll ans=a;//1不满足容斥原理 for(int i=2;i<=b;++i){ans+=solve(a,i);}printf("%lld\n",ans);}return 0;}

原创粉丝点击