博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu (欧拉函数+容斥原理) GCD
阅读量:5278 次
发布时间:2019-06-14

本文共 1056 字,大约阅读时间需要 3 分钟。

题目链接

看了别人的方法才会做 参考博客

题意 a,b,c,d,k五个数,a与c可看做恒为1,求在a到b中选一个数x,c到d中选一个数y,使得gcd(x,y)等于k,求x和y有多少对。

首先可以想到选取的必是k的倍数,假设是x和y倍,则x和y一定是互质的在,那么就变成了求1到b/k和1到d/k的之间的互质的组数。

假设d大于b的话,可以从1到d枚举i,当i小于等于b的时候,互质的数的个数就是其欧拉函数,当i大于b的时候就不是欧拉函数了,因为与i互质的

数要不大于b,那么可以逆向思维一下,求在不大于b的数中与i互质的数,这里就要用到容斥原理,

容斥原理大致是如果被计数的事物有A、B两类,那么,A类B类元素个数总和= 属于A类元素个数+ 属于B类元素个数—既是A类又是B类的元素个数。

那么在这道题里就是;  区间中与i不互质的个数 = (区间中i的每个质因数的倍数个数)-(区间中i的每两个质因数乘积的倍数)+(区间中i的每3个质因数的成绩的倍数个数)-(区间中i的每4个质因数的乘积)+~~~~~(这个容斥想了好一会儿才想通)

然后用dfs求容斥原理,看了别人代码才看懂,还是太菜。

1 #include
2 #include
3 using namespace std; 4 typedef long long ll; 5 const int maxn=100010; 6 int num[maxn],p[maxn][50]; 7 ll enul[maxn]; 8 void great(){ 9 int i,j;10 enul[1]=1;11 for (i=2;i
d) swap(b,d);41 ll ans=0;42 for (i=1;i<=b;i++)43 ans+=enul[i];44 for (i=b+1;i<=d;i++){45 ans+=b-dfs(0,b,i);46 }47 printf("Case %d: %I64d\n",t++,ans);48 }49 50 return 0;51 }

 

转载于:https://www.cnblogs.com/JJCHEHEDA/p/5267251.html

你可能感兴趣的文章
composer 报 zlib_decode(): data error
查看>>
hdu 3938 并查集
查看>>
《深入分析Java Web技术内幕》读书笔记之JVM内存管理
查看>>
python之GIL release (I/O open(file) socket time.sleep)
查看>>
软件开发与模型
查看>>
161017、SQL必备知识点
查看>>
kill新号专题
查看>>
MVC学习系列——Model验证扩展
查看>>
字符串
查看>>
vue2.x directive - 限制input只能输入正整数
查看>>
实现MyLinkedList类深入理解LinkedList
查看>>
自定义返回模型
查看>>
C#.NET 大型通用信息化系统集成快速开发平台 4.1 版本 - 客户端多网络支持
查看>>
HDU 4122
查看>>
Suite3.4.7和Keil u3自带fx2.h、fx2regs.h文件的异同
查看>>
打飞机游戏【来源于Crossin的编程教室 http://chuansong.me/account/crossincode 】
查看>>
[LeetCode] Merge Intervals
查看>>
【翻译自mos文章】当点击完 finishbutton后,dbca 或者dbua hang住
查看>>
Linux编程简介——gcc
查看>>
2019年春季学期第四周作业
查看>>