1. /**
  2. 题目:hdu6053 TrickGCD
  3. 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6053
  4. 题意:You are given an array A , and Zhu wants to know there are how many different array B satisfy the following conditions?
  5.  
  6. * 1≤Bi≤Ai
  7. * For each pair( l , r ) (1≤l≤r≤n) , gcd(bl,bl+1...br)≥2
  8.  
  9. 思路:枚举2<=gcd<=misA; misA表示A数组最小的数。
  10.  
  11. 当gcd==2. 贡献为: (a1/2)*(a2/2)*...*(an/2);所有2的倍数的组合。
  12. 当gcd==3. 贡献为: (a1/3)*(a2/3)*...*(an/3);所有3的倍数的组合。
  13. 当gcd==4.不需要计算因为在2中算过了。


  14. gcd==6. 减去。因为2,3都算过6,所以多算了一次。
  15. 也就是按照容斥原理的做法。
  16. 如果gcd可以被一个素数的平方整除,那么该gcd不用计算。
  17. 否则:f(i) = (-1)^(k+1); k表示i这个数的素因子个数。 由于mu[i] = (-1)^k; 所以求mu之后取反。
  18.  
  19. 对于确定的gcd==2,计算贡献:因为ai/2很多结果相同。[gcd,2*gcd)范围内的数/gcd的结果都是1,[2*gcd,3*gcd)范围内的数/gcd的结果都是2.。。。
  20. 所以贡献等于1^num1 * 2^num2 * 3^num3 ... (numi表示结果为1的数量。可以利用前缀和统计范围内的数。)
  21. 其他类比。
  22. */
  23. #include <cstdio>
  24. #include <cstring>
  25. #include <algorithm>
  26. #include <set>
  27. #include <iostream>
  28. #include <vector>
  29. using namespace std;
  30. typedef long long LL;
  31. #define ms(x,y) memset(x,y,sizeof x)
  32. typedef pair<int, int> P;
  33. const int INF = 0x3f3f3f3f;
  34. const int mod = 1e9 + ;
  35. const int maxn = 1e5 + ;
  36. vector<P> gd;///value, num;
  37. int sum[maxn];
  38. int vis[maxn], mu[maxn];
  39. int prime[maxn], cnt;
  40. void init()///莫比乌斯
  41. {
  42. memset(vis,,sizeof(vis));
  43. mu[] = ;
  44. cnt = ;
  45. for(int i=; i<maxn; i++)
  46. {
  47. if(!vis[i])
  48. {
  49. prime[cnt++] = i;
  50. mu[i] = -;
  51. }
  52. for(int j=; j<cnt&&i*prime[j]<maxn; j++)
  53. {
  54. vis[i*prime[j]] = ;
  55. if(i%prime[j]) mu[i*prime[j]] = -mu[i];
  56. else
  57. {
  58. mu[i*prime[j]] = ;
  59. break;
  60. }
  61. }
  62. }
  63. for(int i = ; i < maxn; i++){
  64. if(mu[i]!=){
  65. gd.push_back(P(i,-mu[i]));
  66. }
  67. }
  68. }
  69. LL Pow(LL x, int y)
  70. {
  71. LL p = ;
  72. while (y)
  73. {
  74. if (y & ) p = p*x%mod;
  75. x = x*x%mod;
  76. y >>= ;
  77. }
  78. return p;
  79. }
  80. int main()
  81. {
  82. int T, cas = ;
  83. int n;
  84. init();
  85. cin >> T;
  86. while (T--)
  87. {
  88. scanf("%d", &n);
  89. ms(sum, );
  90. int x, misx = INF;
  91. for (int i = ; i < n; i++) {
  92. scanf("%d", &x);
  93. misx = min(misx, x);
  94. sum[x]++;
  95. }
  96. for (int i = ; i < maxn; i++) {
  97. sum[i] += sum[i - ];
  98. }
  99. LL ans = ;
  100. int len = gd.size();
  101. for (int i = ; i < len&&gd[i].first <= misx; i++) {
  102. int gcd = gd[i].first;
  103. LL cnt = ;
  104. for (int j = gcd; j < maxn; j += gcd) {
  105. cnt = cnt*Pow(j / gcd, sum[min(maxn - , j + gcd - )] - sum[j - ]) % mod;
  106. }
  107. ans = (ans + cnt*gd[i].second + mod) % mod;
  108. //cout<<"gcd = "<<gcd<<endl;
  109. //cout<<"ans = "<<ans<<endl;
  110. }
  111. //cout<<"ans = "<<ans<<endl;
  112. printf("Case #%d: %lld\n", cas++, ans);
  113. }
  114.  
  115. return ;
  116. }

hdu6053 TrickGCD 容斥原理的更多相关文章

  1. HDU-6053 TrickGCD

    题目连接: https://vjudge.net/problem/HDU-6053 Description You are given an array A , and Zhu wants to kn ...

  2. [Hdu-6053] TrickGCD[容斥,前缀和]

    Online Judge:Hdu6053 Label:容斥,前缀和 题面: 题目描述 给你一个长度为\(N\)的序列A,现在让你构造一个长度同样为\(N\)的序列B,并满足如下条件,问有多少种方案数? ...

  3. hdu 6053: TrickGCD (2017 多校第二场 1009) 【莫比乌斯 容斥原理】

    题目链接 定义f[n]表示n是最大公约数情况下的计数,F[n]为n是公约数情况下的计数 (可以和 http://www.cnblogs.com/Just--Do--It/p/7197788.html  ...

  4. HDU 6053 - TrickGCD | 2017 Multi-University Training Contest 2

    /* HDU 6053 - TrickGCD [ 莫比乌斯函数,筛法分块 ] | 2017 Multi-University Training Contest 2 题意: 给出数列 A[N],问满足: ...

  5. HDU 6053 TrickGCD —— 2017 Multi-University Training 2

    TrickGCD Time Limit: 5000/2500 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total ...

  6. hdu4059 The Boss on Mars(差分+容斥原理)

    题意: 求小于n (1 ≤ n ≤ 10^8)的数中,与n互质的数的四次方和. 知识点: 差分: 一阶差分: 设  则    为一阶差分. 二阶差分: n阶差分:     且可推出    性质: 1. ...

  7. hdu2848 Visible Trees (容斥原理)

    题意: 给n*m个点(1 ≤ m, n ≤ 1e5),左下角的点为(1,1),右上角的点(n,m),一个人站在(0,0)看这些点.在一条直线上,只能看到最前面的一个点,后面的被档住看不到,求这个人能看 ...

  8. BZOJ2301: [HAOI2011]Problem b[莫比乌斯反演 容斥原理]【学习笔记】

    2301: [HAOI2011]Problem b Time Limit: 50 Sec  Memory Limit: 256 MBSubmit: 4032  Solved: 1817[Submit] ...

  9. BZOJ 2440: [中山市选2011]完全平方数 [容斥原理 莫比乌斯函数]

    2440: [中山市选2011]完全平方数 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3028  Solved: 1460[Submit][Sta ...

随机推荐

  1. windows Visual Studio 2017 编译 HEVC cmake-3.8.1-win64-x64.msi 下载

    ttps://github.com/OpenHEVC/openHEVC 下载一 直接下载源码(可选)或下载源码包,我这里下载的是源码 打开 Visual Studio () 去 github 找到源码 ...

  2. [Angular] Two things about OnChanges Lifecycle hook

    1. ngOnChanges is called before ngOnInit but after constructor() 2. ngOnChanges is called because of ...

  3. 求字符串A与字符串B的最长公共字符串(JAVA)

    思路:引入一个矩阵的思想,把字符串A(长度为m)当成矩阵的行,把字符串B(长度为n)当矩阵的列.这样就构成一个m*n的矩阵.若该矩阵的节点相应的字符同样,即m[i]=n[j]时.该节点值为1:当前字符 ...

  4. 算法笔记_164:算法提高 最小方差生成树(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 给定带权无向图,求出一颗方差最小的生成树. 输入格式 输入多组测试数据.第一行为N,M,依次是点数和边数.接下来M行,每行三个整数U,V, ...

  5. HTML 的超链接 a 标签中如何设置其宽度和高度?

    HTML 的超链接 a 标签中如何设置其宽度和高度? 在DIV CSS布局中,html 中 a 超链接标签,直接对其设置宽度和高度不能生效,设置宽度和高度也不起作用,这里为大家分享如何实现 a 标签宽 ...

  6. 批量部署 自动化之 - [pssh](转)

    并行执行命令工具简介 作为运维工程师来讲,机器数量到一定级别的时候,批量运维和管理机器就是一件费神的事情,还好有很多可以批量并行执行命令的工具,比如 pssh , python fabrictaoba ...

  7. Navicat Premium如何打开SQL文件.MDF和.LDF文件

    相信大家再装SQL Server时都会遇到一件很头疼的事情--装完SQL server之后发现没有启动程序.没有经验的会以为SQL SERVER安装失败了于是选择重装.可是呵呵,重装了4,5次还是一样 ...

  8. 【微信小程序】获取轮播图当前图片下标、滑动展示对应的位数、点击位数展示对应图片

    业务需求: 3个图片轮番播放,可以左右滑动,点击指示点可以切换图片  index.wxml: 这里使用小程序提供的<swiper>组件autoplay:自动播放interval:自动切换时 ...

  9. jboss 的debug启动4法

    http://xo-tobacoo.iteye.com/blog/684946方式一: 使用myeclipse,全自动化,不再赘述 方式二: eclipse下使用server工具,部署后使用debug ...

  10. bootstrap学习笔记 插件概述

    Bootstrap插件概览 在前面布局组件章节中所讨论的组件仅仅是个开始.Bootstrap自带的12种jQuery插件,扩展了功能,可以给站点添加更多的互动.即使您不是一名高级的js开发人员, 你也 ...