题意:给定n个数ai, ai <= 10000, n <= 10000, 从中选出4个数要求gcd为1,这样的集合有多少个?

分析:首先总共集合nCr(n, 4) = n*(n-1)*(n-2)*(n-3)/24个,那么需要减掉gcd >=2 的集合。先减掉gcd为各个素数的方案数目,然后再由这些素数组成一些因子,考虑gcd为这些因子的情况。最后总结起来就是,素数个数为奇数时,减去;素数个数为偶数时,加上。具体实现的时候只要对每个ai分解质因数,然后单独考虑他的素因子能组成哪些数,这样再计算。

  1. #include <cstdio>
  2. #include <iostream>
  3. #include <map>
  4. #include <cstring>
  5. #include <cstdlib>
  6. #include <cmath>
  7. #define pb push_back
  8. #define mp make_pair
  9. #define esp 1e-8
  10. #define lson l, m, rt<<1
  11. #define rson m+1, r, rt<<1|1
  12. #define sz(x) ((int)((x).size()))
  13. #define pb push_back
  14. #define in freopen("solve_in.txt", "r", stdin);
  15. #define bug(x) printf("Line : %u >>>>>>\n", (x));
  16. #define inf 0x7f7f7f7f
  17. using namespace std;
  18. typedef long long LL;
  19. typedef map<int, int> MPS;
  20. typedef pair<int, int> PII;
  21.  
  22. const int maxn = + ;
  23. int a[maxn];
  24. LL vis[][maxn], p[], pa[];
  25. int cnt;
  26. void dfs(int st, int pos, int lim) {
  27. if(pos == lim) {
  28. int tmp = ;
  29. for(int i = ; i < pos; i++)
  30. tmp *= pa[i];
  31. vis[lim][tmp]++;
  32. return;
  33. }
  34. for(int i = st; i < cnt; i++) {
  35. pa[pos] = p[i];
  36. dfs(i+, pos+, lim);
  37. }
  38. }
  39. int main() {
  40.  
  41. int n;
  42. while(scanf("%d", &n) == ) {
  43. memset(vis, , sizeof vis);
  44. for(int i = ; i <= n; i++) {
  45. scanf("%d", a+i);
  46. int x = a[i];
  47. cnt = ;
  48. for(int j = ; j*j <= x; j++) {
  49. if(x%j == ) {
  50. p[cnt++] = j;
  51. while(x%j == )
  52. x /= j;
  53. }
  54. }
  55. if(x != )
  56. p[cnt++] = x;
  57. for(int j = ; j <= cnt; j++)
  58. dfs(, , j);
  59. }
  60. double ans = 1.0*n*(n-)*(n-)*(n-)/;
  61. for(int i = ; i < ; i++)
  62. for(int j = ; j <= ; j++)
  63. if(vis[i][j] >= ) {
  64. double tmp = 1.0;
  65. for(LL k = vis[i][j]; k > vis[i][j]-; k--)
  66. tmp = tmp*k;
  67. tmp /= ;
  68. ans += ((i&) ? - : )*tmp;
  69. }
  70. printf("%.0f\n", ans);
  71. }
  72. return ;
  73. }

UPD:这题还可以用扩展欧拉函数做?链接:http://scturtle.is-programmer.com/posts/19402.html

其实是概率角度解释解释欧拉函数,然后拓展一下就可以解这个题了。1/p为包含素因子p的概率。1/p^n为n个数都包含素因子p的概率。

ans = m^n * ∏(1-1/(p^n))

POJ 3904 Sky Code的更多相关文章

  1. POJ 3904 Sky Code (容斥原理)

    B - Sky Code Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit ...

  2. [poj 3904] sky code 解题报告(组合计算+容斥原理)

    题目链接:http://poj.org/problem?id=3904 题目大意: 给出一个数列,询问从中取4个元素满足最大公约数为1的方案数 题解: 很显然,ans=总的方案数-最大公约数大于1的4 ...

  3. poj3904 Sky Code —— 唯一分解定理 + 容斥原理 + 组合

    题目链接:http://poj.org/problem?id=3904 Sky Code Time Limit: 1000MS   Memory Limit: 65536K Total Submiss ...

  4. POJ Sky Code 莫比乌斯反演

    N. Sky Code Time Limit: 1000ms Case Time Limit: 1000ms Memory Limit: 65536KB   64-bit integer IO for ...

  5. poj 3904(莫比乌斯反演)

    POJ 3904 题意: 从n个数中选择4个数使他们的GCD = 1,求总共有多少种方法 Sample Input 4 2 3 4 5 4 2 4 6 8 7 2 3 4 5 7 6 8 Sample ...

  6. POJ3904 Sky Code

    题意 Language:Default Sky Code Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 3980 Accepte ...

  7. POJ3094 Sky Code(莫比乌斯反演)

    POJ3094 Sky Code(莫比乌斯反演) Sky Code 题意 给你\(n\le 10^5\)个数,这些数\(\le 10^5\),问这些这些数组成的互不相同的无序四元组(a,b,c,d)使 ...

  8. 【POJ 1850】 Code

    [POJ 1850] Code 还是非常想说 数位dp真的非常方便! !. 数位dp真的非常方便!.! 数位dp真的非常方便! !! 重要的事说三遍 该题转换规则跟进制差点儿相同 到z时进一位 如az ...

  9. POJ 3904(容斥原理)

    Sky Code Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 1750   Accepted: 545 Descripti ...

随机推荐

  1. Contest1065 - 第四届“图灵杯”NEUQ-ACM程序设计竞赛(个人赛)E粉丝与分割平面

    题目描述 在一个平面上使用一条直线最多可以将一个平面分割成两个平面,而使用两条直线最多可将平面分割成四份,使用三条直线可将平面分割成七份--这是个经典的平面分割问题,但是too simple,作为一个 ...

  2. Windows内存管理[转]

    本文主要内容:1.基本概念:物理内存.虚拟内存:物理地址.虚拟地址.逻辑地址:页目录,页表2.Windows内存管理3.CPU段式内存管理4.CPU页式内存管理 一.基本概念1. 两个内存概念物理内存 ...

  3. 小米2s换了屏幕后不能近距离对焦,拆过后无法对焦?

    主要问题就是小米2/2S手机中壳套后摄像头的位置,里面还有一个正方形的黑色塑胶垫片,一般拆机后这个垫片是不会掉出来的,所以一般上盖时也是直接把中壳合上后上螺丝. 这样安装基本会导致塑胶垫片把摄像头顶住 ...

  4. 使用VS时点右键卡住—不响应的问题

    以前因为论坛,后来因为工作,发现已经好久没有来百度空间了.也好久没人留言或发表评论了,今天自己更新一下吧. 关于使用VS时点右键卡住或不响应的问题,我是在VS 2008中遇到的,不知道其它的版本有没有 ...

  5. Kakfa揭秘 Day3 Kafka源码概述

    Kakfa揭秘 Day3 Kafka源码概述 今天开始进入Kafka的源码,本次学习基于最新的0.10.0版本进行.由于之前在学习Spark过程中积累了很多的经验和思想,这些在kafka上是通用的. ...

  6. Random类(java.util)

    转自 Random类中实现的随机算法是伪随机,也就是有规则的随机.在进行随机时,随机算法的起源数字称为种子数(seed),在种子数的基础上进行一定的变换,从而产生需要的随机数字. 相同种子数的Rand ...

  7. Python在Windows下开发环境配置汇总

    最近比较关注学习Python方面的资料和课程,由于Python本身基本都是在Linux下开发,本人windows用习惯了初用Linux各种别扭啊. 下面将我在配置Windows环境下的禁言写出来,与大 ...

  8. PCB优化设计(转载)

    PCB优化设计(一) 2011-04-25 11:55:36|  分类: PCB设计   目 前SMT技术已经非常成熟,并在电子产品上广泛应用,因此,电子产品设计师有必要了解SMT技术的常识和可制造性 ...

  9. 进程(Process)和线程(Thread)的关系和区别

    Definition定义-------------Process进程是应用程序的一次运行活动:从操作系统核 心角度来说,进程是操作系统分配和调度系统内存资源.cpu时间片等资源的基本单位,为正在运行的 ...

  10. PS 颜色表大全-颜色中文名(1)

    颜色中文名  鸨色#f7acbc 赤白橡#deab8a 油色#817936 绀桔梗#444693 踯躅色#ef5b9c 肌色#fedcbd 伽罗色#7f7522 花色#2b4490 桜色#feeeed ...