hdu 4135 Co-prime 容斥原理
2015-08-26 10:45
169 查看
题意是求a到b的闭区间内有多少个数与n互质,考虑到数据范围比较大,所以我们先用欧拉函数的方式将n的因子分解出来。对于每个因子我们采用dfs来组合他们,并求出范围内和他们不互质的数的个数。这里我们采用容斥原理来处理重复。
#include<bits/stdc++.h> using namespace std; typedef long long ll; ll ans,a,b,c[2048],n; int cnt; ll gcd(ll u,ll v) { return v==0?u:gcd(v,u%v); } void dfs(int cur,ll lcm,int num) { lcm=c[cur]/gcd(c[cur],lcm)*lcm; //printf("%lld\n",lcm); if(num%2==1) ans+=(b/lcm-(a-1)/lcm); else ans-=(b/lcm-(a-1)/lcm); for(int i=cur+1;i<cnt;i++) dfs(i,lcm,num+1); } int main() { ll i; int _,k,j; scanf("%d",&_); for(k=1; k<=_; k++) { scanf("%lld%lld%lld",&a,&b,&n); memset(c,0,sizeof(c)); ans=cnt=0; for(i=2;i*i<=n&&n>1;i++) { while(n%i==0) { c[cnt++]=i; while(n%i==0) n/=i; } } if(n>1) c[cnt++]=n; for(j=0; j<cnt; j++) dfs(j,c[j],1); ans=b-a+1-ans; printf("Case #%d: %lld\n",k,ans); } return 0; }
相关文章推荐
- SQL Server视图
- C++注释规范
- GridControl 控件添加按钮列
- Problem 1414 - URL
- 用Linux运维来理解西游记里面的生死薄
- boundingRect函数
- POJ 2385 Apple Catching
- SQL获取分组第一条记录
- 第一章笔记整理
- OpenGL入门学习
- C++虚继承的内存模型
- Android 弹性ListView和ScrollView 简单优雅地实现回弹效果
- hdu 3371 Connect the Cities
- XIB
- 机器学习--python归一化特征值
- 用户控件(一) ----交换信息
- Android软件开发需要学什么
- Navicat连接oracle 10g出现unsupported server character set ZHS16GBK错误
- VC++编写DLL供C#使用
- 用Linux运维来理解西游记里面的生死薄