题目链接: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. [Angular] Send Data via HTTP using Angular HttpParams

    Obviously in a real world application we do not only fetch data from the backend, but we also send d ...

  2. MySQL优化之——集群搭建步骤具体解释

    转载请注明出处:http://blog.csdn.net/l1028386804/article/details/46833179 1 概述 MySQL Cluster 是MySQL 适合于分布式计算 ...

  3. WCF 无法激活服务,由于它不支持 ASP.NET 兼容性。已为此应用程序启用了 ASP.NET 兼容性

    作者:jiankunking 出处:http://blog.csdn.net/jiankunking 错误信息: 无法激活服务.由于它不支持 ASP.NET 兼容性.已为此应用程序启用了 ASP.NE ...

  4. ABAP FIELD-SYMBOLS 有大作用- 将没有可改參数的增强出口变得也能改主程序的值了

    看下图代码: report  z_xul_test2 中 定义了 全局变量 G_DATA1 , 分别调用了 z_xul_tes1 中的 form  和 function zbapi_test , 这两 ...

  5. [debug]重定义默认參数

    编敲代码过程中遇到重定义默认參数的错误,例如以下例所看到的: #include<iostream> #include<stdlib.h> using namespace std ...

  6. Java採用JNI调用VC++生成的dll(Java与C++交互)

    应项目需求,须要android调用java,java再调用C++实现android一个图片匹配的功能,我们作为java组须要和C++和Android进行交互.以下是java和C++採用JNI的方式进行 ...

  7. poj3249 Test for job 【图的DAG dp】

    #include <cstdio> #include <cstdlib> #include <iostream> #include <algorithm> ...

  8. PHP中用下标符号[]去读取字符串的逻辑

    PHP中 [(下标)] 符号不仅能够应用于数组和对象,还能够应用于字符串,假设不注意非常easy出错. 比方获取一个网络接口,正常情况下会返回一个数组结构的json,经过解析之后结果为: array( ...

  9. NOIP2017提高组 模拟赛13(总结)

    NOIP2017提高组 模拟赛13(总结) 第一题 函数 [题目描述] [输入格式] 三个整数. 1≤t<10^9+7,2≤l≤r≤5*10^6 [输出格式] 一个整数. [输出样例] 2 2 ...

  10. bzoj3173: [Tjoi2013]最长上升子序列(树状数组+二分倒推)

    3173: [Tjoi2013]最长上升子序列 题目:传送门 题解:  好题! 怎么说吧...是应该扇死自己...看错了两次题: 每次加一个数的时候,如果当前位置有数了,是要加到那个数的前面,而不是直 ...