题目链接:http://poj.org/problem?id=3904

题目大意:

给出一个数列,询问从中取4个元素满足最大公约数为1的方案数

题解:

很显然,ans=总的方案数-最大公约数大于1的4个元素的组合的方案数

       =总的方案数-存在公约数大于1的4个元素的组合的方案数

考虑后者如何计算

容斥一下

后者=含有一个质因子(不仅仅是一个,应该是至少一个,后面的同理)的元素的个数取4的方案数-含有两个质因子的元素的个数取4的方案数+含有三个质因子的元素的个数取4的方案数...

朴素做法是枚举质因子,判断当前的质因子的公倍数有几个然后统计答案,但是我们还有其他的方法

怎么做呢?我们是不是可以枚举约数,根据这个约数由几个不同的质因子组成判断是+号还是-号(质因子不可以重复),并且在已知下它的倍数在数列中出现的次数计算对答案的贡献

具体实现就是对于数列中的每一个元素处理它的不同质因子组合成的约数,注意这些约数的质因子不可以重复。这样的话,当我们枚举到这个约数的时候,我们就可以直接知道上述的两个信息

一个小理解:注意一个数可能在一个质因子的时候产生贡献,同时也在多个质因子的时候同样产生贡献

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<vector>
using namespace std;
typedef long long ll; const int N=1e4+;
int n;
int a[N],num[N],cunt[N];
vector <int> pr;
void div(int x)
{
pr.clear();
for (int i=;i*i<=x;i++)
{
if (x%i) continue;
pr.push_back(i);
while (x%i==) x/=i;
}
if (x>) pr.push_back(x);
}
void solve(int x)
{
div(x);
int size=pr.size();
int all=(<<size);
for(int i=;i<all; i++)
{
ll t=,ci=;
for(int j=;j<size;j++)
{
if(i&(<<j))
{
t*=pr[j];
ci++;
}
}
cunt[t]++;//该不含重复质因子的约数的倍数出现的次数
num[t]=ci;//记录下含有几个不同的质因子
}
}
ll C(ll x)
{
return x*(x-)*(x-)*(x-)/;
}
int main()
{
while (cin>>n)
{
memset(cunt,,sizeof(cunt));
for (int i=;i<=n;i++) scanf("%d",a+i),solve(a[i]);
ll res=;
for (int i=;i<=;i++)
if (cunt[i])
{
if (num[i]&) res+=C(cunt[i]);
else res-=C(cunt[i]);
}
res=C(n)-res;
printf("%lld\n",res);
}
return ;
}

[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

    题意:给定n个数ai, ai <= 10000, n <= 10000, 从中选出4个数要求gcd为1,这样的集合有多少个? 分析:首先总共集合nCr(n, 4) = n*(n-1)*(n ...

  3. [poj 2773] Happy 2006 解题报告 (二分答案+容斥原理)

    题目链接:http://poj.org/problem?id=2773 题目大意: 给出两个数m,k,要求求出从1开始与m互质的第k个数 题解: #include<algorithm> # ...

  4. Tarjan算法求解桥和边双连通分量(附POJ 3352 Road Construction解题报告)

     http://blog.csdn.net/geniusluzh/article/details/6619575 在说Tarjan算法解决桥和边双连通分量问题之前我们先来回顾一下Tarjan算法是如何 ...

  5. POJ 3126 Prime Path 解题报告(BFS & 双向BFS)

    题目大意:给定一个4位素数,一个目标4位素数.每次变换一位,保证变换后依然是素数,求变换到目标素数的最小步数. 解题报告:直接用最短路. 枚举1000-10000所有素数,如果素数A交换一位可以得到素 ...

  6. [POJ 1001] Exponentiation C++解题报告 JAVA解题报告

        Exponentiation Time Limit: 500MS   Memory Limit: 10000K Total Submissions: 126980   Accepted: 30 ...

  7. poj 3080 Blue Jeans 解题报告

    题目链接:http://poj.org/problem?id=3080 该题属于字符串处理中的串模式匹配问题.题目要求我们:给出一个DNA碱基序列,输出最长的相同的碱基子序列.(保证在所有的序列中都有 ...

  8. 【原创】poj ----- 2376 Cleaning Shifts 解题报告

    题目地址: http://poj.org/problem?id=2376 题目内容: Cleaning Shifts Time Limit: 1000MS   Memory Limit: 65536K ...

  9. 【原创】poj ----- 1611 The Suspects 解题报告

    题目地址: http://poj.org/problem?id=1611 题目内容: The Suspects Time Limit: 1000MS   Memory Limit: 20000K To ...

随机推荐

  1. Socket实现一个简单的半双工通信

    Socket是client进行在网络与server进行数据交互的一种基本通信方式.通信有三种通信.即单工.半双工,和全双工. 所谓单工,就是仅仅可以进行单向通信,如bb机. 而半双工就是一来一回的通信 ...

  2. MongoDB创建\更新\删除文档操作

     一.插入\创建文档 --当插入一个不存在的文档时,会自己主动创建一个文档 [root@racdb ~]# mongo MongoDB shell version: 2.4.14 connecti ...

  3. 棋盘覆盖问题python3实现

    在2^k*2^k个方格组成的棋盘中,有一个方格被占用,用下图的4种L型骨牌覆盖全部棋盘上的其余全部方格,不能重叠. 代码例如以下: def chess(tr,tc,pr,pc,size): globa ...

  4. CNN tflearn处理mnist图像识别代码解说——conv_2d参数解释,整个网络的训练,主要就是为了学那个卷积核啊。

    官方参数解释: Convolution 2D tflearn.layers.conv.conv_2d (incoming, nb_filter, filter_size, strides=1, pad ...

  5. Linux常用命令之rpm安装命令

    转自:http://www.cnblogs.com/datasyman/p/6942557.html 在 Linux 操作系统下,几乎所有的软件均通过RPM 进行安装.卸载及管理等操作.RPM 的全称 ...

  6. Eclipse里Tomcat报错:Document base ……does not exist or is not a readable directory(图文详解)

    问题描述: 严重: Error starting static Resourcesjava.lang.IllegalArgumentException: Document base D:\Code\M ...

  7. (转载) 百度地图工具类封装(包括定位,附近、城市、范围poi检索,反地理编码)

    目录视图 摘要视图 订阅 赠书 | 异步2周年,技术图书免费选      程序员8月书讯      项目管理+代码托管+文档协作,开发更流畅 百度地图工具类封装(包括定位,附近.城市.范围poi检索, ...

  8. php创建图像具体步骤

    php 的图像处理在验证码是最常见的,下面说下使用php创建图像的具体步骤. 简要说明:PHP 并不仅限于创建 HTML 输出, 它也可以创建和处理包括 GIF, PNG(推荐), JPEG, WBM ...

  9. hiho 171周 - 水题,并查集

    题目链接 题目描述: 输入4 alice 2 alice@hihocoder.com alice@gmail.com bob 1 bob@qq.com alicebest 2 alice@gmail. ...

  10. jq 鼠标点击跳转页面后 改变点击菜单的样式代码

    点击菜单跳转页面,然而跳转后的页面字体并没有加粗用如下代码 <div class="bg01 menu"> <img class="img01" ...