题目链接:

http://poj.org/problem?id=3904

题目大意:

给你N个整数。从这N个数中选择4个数,使得这四个数的公约数为1。求满足条件的

四元组个数。

解题思路:

四个数的公约数为1。并不代表四个数两两互质。比方(2,3,4,5)公约数为1,可是

2和4并不互质。

从反面考虑。先求出四个数公约数不为1的情况个数,用总的方案个数

减去四个数公约数不为1的情况个数就是所求。

求四个数公约数不为1的情况个数,须要将N个数每一个数质因数分解,纪录下全部不同

的素因子所能组成的因子(就是4个数的公约数),并统计构成每种因子的素因子个数。

和因子总数。然后再计算组合数。

比方说因子2的个数为a,则四个数公约数为2的个数

为C(a。4)。因子3的个数为b。则四个数公约数为3的个数为C(b。4),因子6(2*3)的个

数为c,则四个数公约数的个数为C(c。4)。

可是公约数为2的情况中或者公约数为3的情况中可能包含公约数为6的情况,相当于几

个集合求并集。这就须要容斥定理来做。详细參考代码。

參考博文:http://blog.csdn.net/qiqijianglu/article/details/8009108

AC代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#define LL __int64
using namespace std; LL C(LL N) //计算 C(N,4)
{
return N * (N-1) * (N-2) * (N-3) / 24;
} LL Factor[10010],ct,Count[10010],Num[10010];
//Count[]纪录当前因子的个数,Num[]纪录当前因子是由几个素因子组成(用于容斥定理的奇加偶减)
void Divide(LL N) //将N分解质因数
{
ct = 0;
for(int i = 2; i <= sqrt(N*1.0); ++i)
{
if(N % i == 0)
{
Factor[ct++] = i;
while(N % i == 0)
N /= i;
}
}
if(N != 1)
Factor[ct++] = N;
} void Solve(LL N) //二进制实现容斥原理
{
Divide(N);
for(int i = 1; i < (1 << ct); ++i)
{
LL tmp = 1;
LL odd = 0;
for(int j = 0; j < ct; ++j)
{
if((1 << j) & i)
{
odd++;
tmp *= Factor[j];
}
}
Count[tmp]++;
Num[tmp] = odd;
}
} int main()
{
LL N,M;
while(~scanf("%I64d",&N))
{
memset(Count,0,sizeof(Count));
for(int i = 0; i < N; ++i)
{
scanf("%I64d",&M);
Solve(M);
}
LL ans = 0;
for(int i = 0; i <= 10000; ++i) //容斥
{
if(Count[i])
{
if(Num[i] & 1)
ans += C(Count[i]);
else
ans -= C(Count[i]);
}
}
printf("%I64d\n",C(N) - ans); //结果为C(N,4) - ans
} return 0;
}

POJ3904 Sky Code【容斥原理】的更多相关文章

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

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

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

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

  3. POJ3904 Sky Code

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

  4. [poj3904]Sky Code_状态压缩_容斥原理

    Sky Code poj-3904 题目大意:给你n个数,问能选出多少满足题意的组数. 注释:如果一个组数满足题意当且仅当这个组中有且只有4个数,且这4个数的最大公约数是1,$1\le n\le 10 ...

  5. Sky Code(poj3904)

    Sky Code Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2085   Accepted: 665 Descripti ...

  6. Sky Code

    Sky Code 给出n个数,求选出4个数组合,使其gcd为1,,\(n<=10000\),每个数\(<=10000\). 解 理解1:容斥原理 注意到Mobius反演式子不好写出,于是我 ...

  7. POJ Sky Code 莫比乌斯反演

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

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

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

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

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

随机推荐

  1. SpringBoot学习笔记(6)----SpringBoot中使用Servlet,Filter,Listener的三种方式

    在一般的运用开发中Controller已经大部分都能够实现了,但是也不排除需要自己实现Servlet,Filter,Listener的方式,SpringBoot提供了三种实现方式. 1. 使用Bean ...

  2. NodeJS学习笔记 (4)网络服务-http(ok)

    原文:https://github.com/chyingp/nodejs-learning-guide 自己敲代码: http模块概览 大多数nodejs开发者都是冲着开发web server的目的选 ...

  3. vue项目测试和打包发布

    在线测试:npm run dev 发布打包:npm run build  打包后,代码文件在dist文件夹下面,可以正式发布了,复制到其它web服务器下面,在浏览器用http访问.

  4. U盘安装CentOS 7系统

    首先,本文适合新的不能再新的新手 小白出身的轩轩,由于最近正在学习Linux的centos系统,所以突发奇想,为什么不把轩轩的本机也安装一个centos系统呢,让两个系统互不干扰,想到就做到,遂开始动 ...

  5. Python学习笔记-练习编写ATM+购物车(购物商城)

    作业需求: 模拟实现一个ATM + 购物商城程序: 1.额度 15000或自定义 2.实现购物商城,买东西加入 购物车,调用信用卡接口结账 3.可以提现,手续费5% 4.支持多账户登录 5.支持账户间 ...

  6. V$ASM_OPERATION

  7. POJ 2442 Sequence(堆的使用练习)

    题目地址:id=2442">POJ 2442 真心没想到这题的思路. .原来是从第一行逐步向下加,每次都仅仅保存前n小的数.顺便练习了下堆.. 只是感觉堆的这样的使用方法用的不太多啊. ...

  8. spring揭秘 读书笔记 二 BeanFactory的对象注冊与依赖绑定

    本文是王福强所著<<spring揭秘>>一书的读书笔记 我们前面就说过,Spring的IoC容器时一个IoC Service Provider,并且IoC Service Pr ...

  9. mysql-高级语言语法

    一.注释 从#字符到行尾 从'-- '序列到行尾.两个破折号之后至少要有一个空格符或制表符. 二.设置变量 用户变量的形式为@var_name,其中变量名varname可以有当前字符集的文字数字字符. ...

  10. 使用iOS原生sqlite3框架对sqlite数据库进行操作

    摘要: iOS中sqlite3框架可以很好的对sqlite数据库进行支持,通过面向对象的封装,可以更易于开发者使用. 使用iOS原生sqlite3框架对sqlite数据库进行操作 一.引言 sqlit ...