Co-prime

Problem's Link:  http://acm.hdu.edu.cn/showproblem.php?pid=4135


推荐: 容斥原理

Mean:

给你一个区间[l,r]和一个数n,求[l,r]中有多少个数与n互素。

analyse:

经典的容斥原理题。

如果题目是说求1~n中有多少个数与n互质,我们一定反应应该是欧拉函数。

但是如果n特别大或者说是求某个给定区间与n互素的个数,这时用欧拉函数就行不通。

容斥做法:首先我们可以在O(sqrt(n))内求出n的所有质因数p1,p2,p3....pk。

对于每个质因数pi,1~r中不与它互素的个数就是r/pi。

然后就是如何容斥了?

首先我们来分析,n<=1e9,那么n的质因数的个数最多不超过9个,那么我们就可以对n的所有质因数进行组合来计算。

例如:30的质因数有3个(2,3,5),我们可以用二进制来表示所有的情况:

001: 5

010: 3

011: 3 5

100: 2

101: 2 5

110: 2 3

111: 2 3 5

假设有k个质因数,那么只需用2^k-1个数的二进制来表示即可。

剩下的就是容斥了,设cnt为1的个数(选中的质因数的个数),当cnt为奇数,sum加上此次的;cnt为偶数,sum减去此次的。

具体看代码。

Time complexity: O(N)

Source code: 

/*
* this code is made by crazyacking
* Verdict: Accepted
* Submission Date: 2015-08-10-19.49
* Time: 0MS
* Memory: 137KB
*/
#include <queue>
#include <cstdio>
#include <set>
#include <string>
#include <stack>
#include <cmath>
#include <climits>
#include <map>
#include <cstdlib>
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
#define  LL long long
#define  ULL unsigned long long
using namespace std;

LL solve(LL r,LL n)
{
     vector<LL> ve;
     LL up=(LL)sqrt(n);
     for(LL i=2;i<=up;++i)
     {
           if(n%i==0)
           {
                 ve.push_back(i);
                 while(n%i==0)
                       n/=i;
           }
     }
     if(n>1) ve.push_back(n);
     LL sum=0,si=ve.size();
     up=(1<<si)-1;
     for(LL i=1;i<=up;++i)
     {
           LL tmp=i,bits=0,mul=1,cnt=0;
           while(tmp)
           {
                 if(tmp&1)
                 {
                       mul*=ve[bits];
                       ++cnt;
                 }
                 ++bits;
                 tmp=tmp>>1;
           }
           LL cur=r/mul;
           if(cnt&1) sum+=cur;
           else sum-=cur;
     }
     return sum;
}

int main()
{
     ios_base::sync_with_stdio(false);
     cin.tie(0);
     LL t,cas=1;
     cin>>t;
     while(t--)
     {
           LL l,r,n;
           cin>>l>>r>>n;
           if(l>r) swap(l,r);
           printf("Case #%lld: %lld\n",cas++,r-l+1-(solve(r,n)-solve(l-1,n)));
     }
     return 0;
}
/*

*/

转载于:https://www.cnblogs.com/crazyacking/p/4719141.html

容斥 - HDU 4135 Co-prime相关推荐

  1. Visible Trees HDU - 2841(容斥)

    Visible Trees HDU - 2841 题意: 大概就是有个m*n个点的矩形从(1,1)到(m,n),问从(0,0)出发直线看过去最多能看到几个点. 题解: 容斥做法参考 这个题和AcWin ...

  2. HDU 6143 Killer Names(排列+容斥,dp)

    Killer Names HDU 6143 (容斥+排列组合,dp+整数快速幂) 2017ACM暑期多校联合训练 - Team 8 1011 Killer Names 题目链接 Time Limit: ...

  3. HDU 4059 The Boss on Mars (容斥)(2011 Asia Dalian Regional Contest)

    The Boss on Mars 思路 显然我们可以求得∑i=1ni4=6n5+15n4+10n3−n30\sum_{i = 1} ^{n} i ^ 4 = \frac{6n^5 + 15n^4 + ...

  4. HDU 2841 Visible Trees(容斥)题解

    题意:有一块(1,1)到(m,n)的地,从(0,0)看能看到几块(如果两块地到看的地方三点一线,后面的地都看不到). 思路:一开始是想不到容斥...后来发现被遮住的地都有一个特点,若(a,b)有gcd ...

  5. hdu 5514 容斥

    hdu 5514 题意:有n个青蛙编号1~n,m块石头编号0~m-1,石头围成一圈,每只青蛙会从第ii块跳到第(i + ai) mod m(i \ + \ a_i) \ mod \ m块,青蛙会跳无数 ...

  6. HDU 5514 Frogs 容斥

    http://acm.hdu.edu.cn/showproblem.php?pid=5514 没有想到怎么利用gcd的性质来改进指数级别的容斥,还是没有理解容斥的思想,只知道基础的. 已经知道结果就在 ...

  7. hdu 5468 Puzzled Elena(前缀性质+dfs序+容斥)

    题目链接:hdu 5468 Puzzled Elena 解题思路 预处理出每个数的因子(注意只需要质因子幂数最大为1的数,例如6=21∗316=2^1 * 3^1)然后用一个数组维护,fac[i]表示 ...

  8. HDU - 5468 Puzzled Elena —— 容斥

    题意: 每个点的子树上有几个节点与该节点的权值互质 思路: 首先要明白怎么求一个集合中有多少个数与n互素 将集合中的数用算术基本定理分解,记录每个数能形成的所有因子的个数,然后将n分解进行容斥,可以求 ...

  9. HDU - 5468 Puzzled Elena (容斥/莫比乌斯)

    做了好几个容斥了,一直找不到feel,这个做完在现在有一点感觉了.虽然刚开始也不会.但就是发现感觉不一样了. 首先,不考虑树的关系,单纯给出一个m,还有一个集合(里面数字任意),求集合里面跟m互质的数 ...

最新文章

  1. 逃离湾区,下一站是哪里?西雅图 PK 奥斯汀
  2. qt for 3520a
  3. java 正则匹配 sql星号,正则表达式匹配星号和换行符之间的字符串
  4. php怎么异步执行,php中异步执行的四种方式
  5. 计算机毕业设计中JAVA 23种开发模式详解(代码举例)
  6. Java并发和多线程3:线程调度和有条件取消调度
  7. linux命令 sync,linux sync命令详解
  8. 计算机打字怎么学笔,学电脑·非常简单:五笔打字
  9. 通达信公式-当天成交量不大于百日均成交量比例
  10. 电气专业学校排名全国计算机专业学校排名,电气工程及其自动化专业学校排名...
  11. sqlplus 命令导入数据文件
  12. 黑马Python笔记4
  13. 用C#实现汉字转化为拼音
  14. 算法竞赛入门经典第11章 无根树转有根树
  15. 人工智能 —— 自然演绎推理
  16. java xms xmn_java堆内存JVM属性调优总结(-Xms -Xmx -Xmn -Xss)
  17. 定时任务实现方式对比
  18. 一份超详细的Spring4常用知识清单!
  19. CAN总线的学习总结
  20. 对比PAYPAL和国际信用卡支付的流程

热门文章

  1. Android中ButterKnife的详细使用
  2. python爬虫06
  3. 支付宝的个人捐赠功能
  4. 数字货币交易所数据安全随笔
  5. 交易引擎的对账状态为空的处理方式
  6. 什么是嵌入式工程师,发展前景如何
  7. JAVA无法加载此类文件,ORA-00376: 此时无法读取文件问题处理
  8. conda移植环境到另一台电脑
  9. Java BIO多人聊天室
  10. 关于HTTPS的几个问题