题意:

这道题和POJ 3090很相似,求|x|≤a,|y|≤b 中站在原点可见的整点的个数K,所有的整点个数为N(除去原点),求K/N

分析:

坐标轴上有四个可见的点,因为每个象限可见的点数都是一样的,所以我们只要求出第一象限可见的点数然后×4+4,即是K。

可见的点满足gcd(x, y) = 1,于是将问题转化为x∈[1, a], y∈[1, b],求gcd(x, y) = 1的个数。

类比HDU 1695可以用莫比乌斯反演来做,我还写了普通的和分块加速的两份代码,交上去发现运行时间相差并不是太多。

  1. #include <cstdio>
  2. #include <algorithm>
  3. typedef long long LL;
  4.  
  5. const int maxn = ;
  6. int mu[maxn+], vis[maxn+], prime[maxn];
  7.  
  8. void Mobius()
  9. {
  10. mu[] = ;
  11. int cnt = ;
  12. for(int i = ; i <= maxn; ++i)
  13. {
  14. if(!vis[i])
  15. {
  16. mu[i] = -;
  17. prime[cnt++] = i;
  18. }
  19. for(int j = ; j < cnt && (LL)i*prime[j] <= maxn; ++j)
  20. {
  21. vis[i*prime[j]] = ;
  22. if(i % prime[j] != ) mu[i*prime[j]] = -mu[i];
  23. else
  24. {
  25. mu[i*prime[j]] = ;
  26. break;
  27. }
  28. }
  29. }
  30. //计算前缀和,用于分块加速
  31. for(int i = ; i <= ; ++i) mu[i] += mu[i-];
  32.  
  33. }
  34.  
  35. int main()
  36. {
  37. Mobius();
  38. int a, b;
  39. while(scanf("%d%d", &a, &b) == )
  40. {
  41. if(a == && b == ) break;
  42. LL K = , N = (LL)(a*+) * (b*+) - ;
  43. if(a > b) std::swap(a, b);
  44. for(int i = , j; i <= a; i = j + )
  45. {
  46. j = std::min(a/(a/i), b/(b/i));
  47. K += (LL)(mu[j] - mu[i-]) * (a/i) * (b/i);
  48. }
  49. //for(int i = 1; i <= a; ++i) K += (LL) mu[i] * (a/i) * (b/i);
  50. K = (K+)*;
  51.  
  52. printf("%.7f\n", (double) K / N);
  53. }
  54.  
  55. return ;
  56. }

代码君

也可以按照紫书上的思路求欧拉函数,因为a的范围比较小,所以可以逐列统计。不过这个方法要比上面的莫比乌斯反演慢得多,试验了下,不管是打表还是单独计算时间都差不多

  1. #include <cstdio>
  2. #include <cmath>
  3. typedef long long LL;
  4.  
  5. int phi(int n)
  6. {
  7. int m = sqrt(n + 0.5);
  8. int ans = n;
  9. for(int i = ; i <= m; ++i) if(n % i == )
  10. {
  11. ans = ans / i * (i-);
  12. while(n % i == ) n /= i;
  13. }
  14. if(n > ) ans = ans / n * (n-);
  15. return ans;
  16. }
  17.  
  18. int gcd(int a, int b)
  19. {
  20. return b == ? a : gcd(b, a%b);
  21. }
  22.  
  23. int main()
  24. {
  25. int a, b;
  26. while(scanf("%d%d", &a, &b) == && a)
  27. {
  28. LL N = (LL)(a*+) * (b*+) - ;
  29. LL K = ;
  30. for(int x = ; x <= a; ++x)
  31. {
  32. int k = b / x;
  33. K += phi(x) * k;
  34. for(int y = k*x+; y <= b; y++)
  35. if(gcd(x, y) == ) K++;
  36. }
  37. K = (K+)*;
  38. printf("%.7f\n", (double)K / N);
  39. }
  40.  
  41. return ;
  42. }

代码君二

UVa 10214 (莫比乌斯反演 or 欧拉函数) Trees in a Wood.的更多相关文章

  1. BZOJ 2818 Gcd (莫比乌斯反演 或 欧拉函数)

    2818: Gcd Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 2534  Solved: 1129 [Submit][Status][Discu ...

  2. 【BZOJ2226】[Spoj 5971] LCMSum 莫比乌斯反演(欧拉函数?)

    [BZOJ2226][Spoj 5971] LCMSum Description Given n, calculate the sum LCM(1,n) + LCM(2,n) + .. + LCM(n ...

  3. 【BZOJ2818】Gcd(莫比乌斯反演,欧拉函数)

    题意:给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的数对(x,y)有多少对 1<=N<=10^7 思路:莫比乌斯反演,同BZOJ2820…… ; ..max]of ...

  4. UVA 11424 GCD - Extreme (I) (欧拉函数+筛法)

    题目:给出n,求gcd(1,2)+gcd(1,3)+gcd(2,3)+gcd(1,4)+gcd(2,4)+gcd(3,4)+...+gcd(1,n)+gcd(2,n)+...+gcd(n-1,n) 此 ...

  5. UVa 10820 (打表、欧拉函数) Send a Table

    题意: 题目背景略去,将这道题很容易转化为,给出n求,n以内的有序数对(x, y)互素的对数. 分析: 问题还可以继续转化. 根据对称性,我们可以假设x<y,当x=y时,满足条件的只有(1, 1 ...

  6. UVA 11426 GCD - Extreme (II) (欧拉函数+筛法)

    题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=70017#problem/O 题意是给你n,求所有gcd(i , j)的和,其中 ...

  7. UVA 11426 GCD - Extreme (II) 欧拉函数

    分析:枚举每个数的贡献,欧拉函数筛法 #include <cstdio> #include <iostream> #include <ctime> #include ...

  8. UVA 11426 GCD - Extreme (II)(欧拉函数打表 + 规律)

    Given the value of N, you will have to find the value of G. The definition of G is given below:Here ...

  9. LightOJ 1375 - LCM Extreme 莫比乌斯反演或欧拉扩展

    题意:给出n [1,3*1e6] 求 并模2^64. 思路:先手写出算式 观察发现可以化成 那么关键在于如何求得i为1~n的lcm(i,n)之和.可以知道lcm(a,b)为ab/gcd(a,b) 变换 ...

随机推荐

  1. Notepad++ 运行脚本快捷键设置

    php:cmd /k /path/to/php.exe "$(FULL_CURRENT_PATH)" & ECHO. & PAUSE & EXIT pyth ...

  2. hbase on spark

    1.在spark的伪分布式环境下安装HBASE (1)版本:我使用的spark版本是1.3.0,使用的hbase版本是hbase-0.94.16 (2)解压,tar zxvf  hbase-0.94. ...

  3. android 注销

    1.在个人中心退出系统MainActivity 2.清空保存的登录数据 3.打开登录LoginActivity 方法: SharedPreferencesManager.getInstance(mCo ...

  4. 内容自适应UILabel

    xcode 6.1 File-New-Project.. iOs-Application-Simple View Application 代码: - (void)viewDidLoad { [supe ...

  5. Oracle监听器—静态注册

    注册就是将数据库作为一个服务注册到监听程序.客户端不需要知道数据库名和实例名,只需要知道该数据库对外提供的服务名就可以申请连接到数据库.这个服务名可能与实例名一样,也有可能不一样. 注册分: 1. 静 ...

  6. linux标准输入输出重定向

    command > filename 把标准输出重定向到一个文件,如果文件不存在则新建,如果存在则覆盖其内容.command >> filename 把标准输出重定向到一个文件中,如 ...

  7. PHP - PDO 之 mysql 事务功能

    <?php /* pdo 学习 */ $dsn = 'mysql:host=localhost;dbname=cswl';//构建连接dsn $db = new pdo($dsn,'root', ...

  8. 【BZOJ 1054】 [HAOI2008]移动玩具

    Description 在一个4*4的方框内摆放了若干个相同的玩具,某人想将这些玩具重新摆放成为他心中理想的状态,规定移动时只能将玩具向上下左右四个方向移动,并且移动的位置不能有玩具,请你用最少的移动 ...

  9. (转)汇编bne的问题

    网址:http://blog.csdn.net/lwj103862095/article/details/8073571 memsetup:    @ 设置存储控制器以便使用SDRAM等外设 mov ...

  10. 查网卡信息(千M o 万M)