题目链接: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. MySQL 创建表时,设置时间字段自己主动插入当前时间

    MySQL 创建表时,设置时间字段自己主动插入当前时间 DROP TABLE IF EXISTS `CONTENT`; CREATE TABLE `CONTENT` ( `ID` char(20) N ...

  2. node16---cookie session

    03.js var express = require("express"); var app = express(); var db = require("./mode ...

  3. Pocket英语语法---五、形式主语是怎么回事

    Pocket英语语法---五.形式主语是怎么回事 一.总结 一句话总结:1.to不定式或动名词可以在主语的位置上,但一般用it代替它做形式主语.这种情况it叫形式主语. It's a great ho ...

  4. VC++基于CXImage库实现缩略图

    一般的图像处理软件都对读入程序的图像文件建一个缩略图的列表,像ACDSee那样.笔者最近在做一个图像处理的项目,处理的原始数据就是图像文件.从项目一开始就想做一个缩略图,但一直苦于技术水平有限,且时间 ...

  5. weboffice7

    document.all.WebOffice1.ShowToolBar = false;

  6. Edge 浏览器

    Edge浏览器设计理念 无法播放:https://edgewelcomecdn.microsoft.com/site/images/tabs/rs3/tabs_screen.acd367a2.mp4 ...

  7. 由ubuntu装好想到的

    这篇不是技术文,有点唠叨的总结.不喜勿喷. 最近开始全面学ubuntu,一翻书回忆起本科没选但是去听了的Linux.当时看的还是楚广明的fedora教程,这多年过去综合很多人的说 法,fedora不稳 ...

  8. Android开发中,9-patch (九宫格)图片作为背景带来的问题

    9-patch 为了解决不同分屏下的图片适应性,对图片做了padding,而在android中,要给一个控件设置背景图,最终是要调用 setBackgroundDrawable  方法来设置图片资源, ...

  9. (转载)Android项目实战(二十八):使用Zxing实现二维码及优化实例

    Android项目实战(二十八):使用Zxing实现二维码及优化实例 作者:听着music睡 字体:[增加 减小] 类型:转载 时间:2016-11-21我要评论 这篇文章主要介绍了Android项目 ...

  10. .map(function(item)...)这个是按hashcode自动遍历的,怎么才能按照我想要的顺序遍历呢?

    上图是我前端的遍历代码.我的item上有一个name的字段,分别是营业执照,税务登记证和经营许可证,我怎么设置才能让函数每次遍历的时候按照这个顺序遍历,而不是item自带的顺序呢? .map(func ...