[HDU 4135] Co-prime · 容斥原理
2015-10-29 10:35
537 查看
题意为求[a,b]中与n互质的数的个数。
可以将问题转化为,求出[1,b]和[1,a-1]中与n互质的数的个数然后用前者减去后者,就是答案。
然后求[1,a]区间中与n互质的数的个数实际上又可以转为求与n不互质的数的个数,在n小的时候可以用欧拉函数求,但是像这题n比较大的时候就适合用容斥原理。
容斥原理思想请自行百度。。。
orz:http://www.cnblogs.com/jiangjing/archive/2013/06/03/3115470.html
可以将问题转化为,求出[1,b]和[1,a-1]中与n互质的数的个数然后用前者减去后者,就是答案。
然后求[1,a]区间中与n互质的数的个数实际上又可以转为求与n不互质的数的个数,在n小的时候可以用欧拉函数求,但是像这题n比较大的时候就适合用容斥原理。
容斥原理思想请自行百度。。。
orz:http://www.cnblogs.com/jiangjing/archive/2013/06/03/3115470.html
#include <stdio.h> #include <algorithm> #include <string.h> #include <vector> using namespace std; #define pb push_back vector<int> p; long long a,b,n; long long ans,T; void init(){ p.clear(); long x=n; for (int i=2;i*i<x;i++) //将n质因数分解 if (x%i==0){ p.pb(i); for (;x%i==0;x/=i); } if (x>1) p.pb(x); } long long calc(long long x){ long long sum=0,cnt,t=1<<(p.size()),val; for (int i=1;i<t;i++){ //用二进制来表示某个因子有没有被选过 val=1;cnt=0; //val表示选取的质因子的乘积 cnt表示选了多少个质因子 for (int j=0;j<p.size();j++) if (i & (1<<j)) cnt++, val*=p[j]; if (cnt&1) sum+=x/val; //容斥原理 奇加偶减 else sum-=x/val; } return x-sum; } int main(){ scanf("%I64d",&T); for (int i=1;i<=T;i++){ scanf("%I64d%I64d%I64d",&a,&b,&n); init(); ans=calc(b)-calc(a-1); printf("Case #%d: %I64d\n",i,ans); } return 0; }
相关文章推荐
- 1032. 挖掘机技术哪家强(20)
- 使用 VisualVM 进行性能分析及调优
- Gruph-cut
- AFNetwork 作用和用法详解
- ios无法播放安卓视频的问题
- android 光标位置设置
- UVa10779 Collectors Problem(最大流)
- 【HTTP劫持和DNS劫持】腾讯的实际业务分析
- ASP.NET中使用FTP
- 已知二叉树的前序和中序遍历,重构该二叉树
- python反射
- android 内存清理
- Android studio Run图标灰色 不能运行
- 用HttpListener 建立web服务器 实现网页浏览、文件上传
- python学习笔记
- Android Drawable各种定义方式
- Android自定义view学习笔记02
- python内置函数
- Piggy-Bank---hdu1114(完全背包)
- JqueryMobile- 搭建主模板