题目链接

题意 : 从[a,b]中找一个x,[c,d]中找一个y,要求GCD(x,y)= k。求满足这样条件的(x,y)的对数。(3,5)和(5,3)视为一组样例 。

思路 :要求满足GCD(x,y)=k的对数,则将b/k,d/k,然后求GCD(x,y)=1的对数即可。假设b/k >= d/k ;对于1到b/k中的某个数s,如果s<=d/k,则因为会有(x,y)和(y,x)这种会重复的情况,所以这时候的对数就是比s小的与s互质的数的个数,即s的欧拉函数。至于重复的情况是指:在d/k中可能有大于s的与d/k互质的数,但是当你把这些加上了之后,当你继续在b/k中找完s之后再找比s大的数的时候会产生和之前加上的情况重复的情况。

当s > d/k时,s分解质因数后,质因数的次数不影响结果。我们看另外那个区间有多少个和s不互质(减一下就好了),于是我们只要看另外那个区间中有多少个数是s质因数的倍数就好了。区间[1..a]中 p的倍数 显然有 a/p个。 我们枚举s的质因数利用容斥原理:看另外那个区间有多少个数与s不互质。

容斥原理的具体如下:

区间中与s不互质的个数 = (区间中s的每个质因数的倍数个数)-(区间中s的每两个质因数乘积的倍数)+(区间中s的每3个质因数的成绩的倍数个数)-(区间中s的每4个质因数的乘积)+...

于是问题变成了统计每个数的不同质因数的个数而忽略次数。这个可以用筛法。具体做法如下:

对每个数保存一个真质因数的列表。初始每个列表的长度为0。然后从2开始,分别检查每个数的列表长度,如果列表长度不为0,则这个数是合数,跳过;如果这个长度为0,则我们找到了一个质数,同时再把这个数的倍数(不包含本身)的列表里加入这个数。

参考

  1. //
  2. #include <iostream>
  3. #include <string.h>
  4. #include <stdio.h>
  5.  
  6. using namespace std ;
  7.  
  8. int a,b,c,d,k,zh[][],sh[] ;
  9. __int64 ans,eu[] ;
  10.  
  11. void eular()
  12. {
  13. eu[] = ;
  14. for(int i = ; i < ; i++)
  15. {
  16. if(!eu[i])
  17. {
  18. for(int j = i ; j < ; j += i)
  19. {
  20. if(!eu[j]) eu[j] = j ;
  21. eu[j] = eu[j] / i * (i-) ;
  22. zh[j][sh[j]++] = i ;
  23. }
  24. }
  25. eu[i] += eu[i-] ;
  26. }
  27. }
  28. __int64 dfs(int s ,int b,int i)
  29. {
  30. __int64 ans1 = ;
  31. for (int j = s ;j < sh[i] ; j++)
  32. {
  33. ans1 += b /zh[i][j] - dfs(j+,b/zh[i][j],i);
  34. }
  35. return ans1;
  36. }
  37. int main()
  38. {
  39. int T ;
  40. scanf("%d",&T) ;
  41. int cas = ;
  42. eular() ;
  43. while(T--)
  44. {
  45. scanf("%d %d %d %d %d",&a,&b,&c,&d,&k) ;
  46. if(k == ){
  47. printf("Case %d: 0\n",cas++) ;
  48. continue ;
  49. }
  50. int maxx = max(b,d) ;
  51. int minn = min(b,d) ;
  52. maxx /= k ;
  53. minn /= k ;
  54. ans = eu[minn] ;
  55. for(int i = minn + ; i <= maxx ; i++)
  56. ans += minn - dfs(,minn,i) ;
  57. printf("Case %d: %I64d\n",cas++,ans) ;
  58. }
  59. return ;
  60. }

HDU 1695 GCD (容斥原理+欧拉函数)的更多相关文章

  1. HDU 1695 GCD(欧拉函数+容斥原理)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1695 题意:x位于区间[a, b],y位于区间[c, d],求满足GCD(x, y) = k的(x, ...

  2. HDU 1695 GCD (欧拉函数+容斥原理)

    GCD Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  3. hdu 1695 GCD (欧拉函数、容斥原理)

    GCD Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submis ...

  4. hdu 1695 GCD(欧拉函数+容斥)

    Problem Description Given 5 integers: a, b, c, d, k, you're to find x in a...b, y in c...d that GCD( ...

  5. HDU 1787 GCD Again(欧拉函数,水题)

    GCD Again Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  6. HDU 2588 GCD(欧拉函数)

    GCD Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submis ...

  7. 题解报告:hdu 2588 GCD(欧拉函数)

    Description The greatest common divisor GCD(a,b) of two positive integers a and b,sometimes written ...

  8. hdu 1787 GCD Again (欧拉函数)

    GCD Again Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  9. HDU1695:GCD(容斥原理+欧拉函数+质因数分解)好题

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1695 题目解析: Given 5 integers: a, b, c, d, k, you're to ...

随机推荐

  1. MyBatis用嵌套ResultMap实现一对多映射

    我的技术博客经常被流氓网站恶意爬取转载.请移步原文:http://www.cnblogs.com/hamhog/p/3959451.html,享受整齐的排版.有效的链接.正确的代码缩进.更好的阅读体验 ...

  2. zedboard搭建交叉编译环境

    参考:http://blog.csdn.net/xzyiverson/article/details/11264417 我安装的LINUX12.04LTS 双系统 下载好交叉编译软件xilinx-20 ...

  3. php 去除数组中重复元素

    去除数组中重复元素, 找了下可以一下两个函数 php array_flip()与array_uniqure() $arr = array(…………) ;// 假设有数组包含一万个元素,里面有重复的元素 ...

  4. Linux多命令协作:管道及重定向

  5. C# ProperTyGrid 自定义属性

    C# 如果要实现自定义属性必须要需要实现接口ICustomTypeDescriptor // 摘要:   //     提供为对象提供动态自定义类型信息的接口.   public interface ...

  6. PHP执行.SQL文件的实例代码分享

    介绍下使用PHP执行.SQL文件的代码一例,分享下. demo.php: <?php ) )) ) ENGINE) unsigned ) unsigned )) ) ENGINE) unsign ...

  7. Mod 与 RequireJS/SeaJS 的那些事

    本文的目的是为了能大让家更好的认识 Mod,之所以引入 RequireJS/SeaJS 的对比主要是应大家要求更清晰的对比应用场景,并不是为了比较出孰胜孰劣,RequireJS 和 SeaJS 都是模 ...

  8. 解决前端浏览器传JSON对像到服务端后全部变成string类型的方法

    这几天公司用nodejs+mongodb来做些东西,UI用的是kendo UI 碰到一个问题: 举个例子var a={"name":"张三","age ...

  9. python post中文引发的不传递,及乱码问题

    使用jquery ajax向后台传值 $.ajax({ type:"POST", url:"" data:{ content:content }, succes ...

  10. Python LOGGING使用方法

    Python LOGGING使用方法 1. 简介 使用场景 场景 适合使用的方法 在终端输出程序或脚本的使用方法 print 报告一个事件的发生(例如状态的修改) logging.info()或log ...