容斥 - HDU 4135 Co-prime
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相关推荐
- Visible Trees HDU - 2841(容斥)
Visible Trees HDU - 2841 题意: 大概就是有个m*n个点的矩形从(1,1)到(m,n),问从(0,0)出发直线看过去最多能看到几个点. 题解: 容斥做法参考 这个题和AcWin ...
- HDU 6143 Killer Names(排列+容斥,dp)
Killer Names HDU 6143 (容斥+排列组合,dp+整数快速幂) 2017ACM暑期多校联合训练 - Team 8 1011 Killer Names 题目链接 Time Limit: ...
- 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 + ...
- HDU 2841 Visible Trees(容斥)题解
题意:有一块(1,1)到(m,n)的地,从(0,0)看能看到几块(如果两块地到看的地方三点一线,后面的地都看不到). 思路:一开始是想不到容斥...后来发现被遮住的地都有一个特点,若(a,b)有gcd ...
- hdu 5514 容斥
hdu 5514 题意:有n个青蛙编号1~n,m块石头编号0~m-1,石头围成一圈,每只青蛙会从第ii块跳到第(i + ai) mod m(i \ + \ a_i) \ mod \ m块,青蛙会跳无数 ...
- HDU 5514 Frogs 容斥
http://acm.hdu.edu.cn/showproblem.php?pid=5514 没有想到怎么利用gcd的性质来改进指数级别的容斥,还是没有理解容斥的思想,只知道基础的. 已经知道结果就在 ...
- hdu 5468 Puzzled Elena(前缀性质+dfs序+容斥)
题目链接:hdu 5468 Puzzled Elena 解题思路 预处理出每个数的因子(注意只需要质因子幂数最大为1的数,例如6=21∗316=2^1 * 3^1)然后用一个数组维护,fac[i]表示 ...
- HDU - 5468 Puzzled Elena —— 容斥
题意: 每个点的子树上有几个节点与该节点的权值互质 思路: 首先要明白怎么求一个集合中有多少个数与n互素 将集合中的数用算术基本定理分解,记录每个数能形成的所有因子的个数,然后将n分解进行容斥,可以求 ...
- HDU - 5468 Puzzled Elena (容斥/莫比乌斯)
做了好几个容斥了,一直找不到feel,这个做完在现在有一点感觉了.虽然刚开始也不会.但就是发现感觉不一样了. 首先,不考虑树的关系,单纯给出一个m,还有一个集合(里面数字任意),求集合里面跟m互质的数 ...
最新文章
- 逃离湾区,下一站是哪里?西雅图 PK 奥斯汀
- qt for 3520a
- java 正则匹配 sql星号,正则表达式匹配星号和换行符之间的字符串
- php怎么异步执行,php中异步执行的四种方式
- 计算机毕业设计中JAVA 23种开发模式详解(代码举例)
- Java并发和多线程3:线程调度和有条件取消调度
- linux命令 sync,linux sync命令详解
- 计算机打字怎么学笔,学电脑·非常简单:五笔打字
- 通达信公式-当天成交量不大于百日均成交量比例
- 电气专业学校排名全国计算机专业学校排名,电气工程及其自动化专业学校排名...
- sqlplus 命令导入数据文件
- 黑马Python笔记4
- 用C#实现汉字转化为拼音
- 算法竞赛入门经典第11章 无根树转有根树
- 人工智能 —— 自然演绎推理
- java xms xmn_java堆内存JVM属性调优总结(-Xms -Xmx -Xmn -Xss)
- 定时任务实现方式对比
- 一份超详细的Spring4常用知识清单!
- CAN总线的学习总结
- 对比PAYPAL和国际信用卡支付的流程