题目链接:

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. javascript实现自动添加文本框功能

    转自:http://www.cnblogs.com/damonlan/archive/2011/08/03/2126046.html 昨天,我们公司的网络小组决定为公司做一个内部的网站,主要是为员工比 ...

  2. 一、数组---数组中的K-diff数对※※※※※

    给定一个整数数组和一个整数 k, 你需要在数组里找到不同的 k-diff 数对.这里将 k-diff 数对定义为一个整数对 (i, j), 其中 i 和 j 都是数组中的数字,且两数之差的绝对值是 k ...

  3. WPF内嵌WCF服务对外提供接口

    要测试本帖子代码请记得管理员权限运行vs. 我写这个帖子的初衷是在我做surface小车的时候有类似的需求,感觉这个功能还挺有意思的,所以就分享给大家,网上有很多关于wcf的文章 我就不一一列举了.公 ...

  4. HDU-5693 D Game 动态规划 两次动规

    题目链接:https://cn.vjudge.net/problem/HDU-5693 题意 中文题 这个游戏是这样的,首先度度熊拥有一个公差集合{D},然后它依次写下N个数字排成一行.游戏规则很简单 ...

  5. luogu P2117 小Z的矩阵(结论题)

    题意 题解 这题有点水. 我们发现对答案有贡献的实际上只有左上到右下的对角线上的数. 因为不在这条对角线上的乘积都要计算两遍,然后%2就都没了... 然后就做完了. #include<iostr ...

  6. MYSQL锁表问题的解决方法

    本文实例讲述了MYSQL锁表问题的解决方法.分享给大家供大家参考,具体如下: 很多时候!一不小心就锁表!这里讲解决锁表终极方法! 案例一 mysql>show processlist; 参看sq ...

  7. 洛谷 P3671 [USACO17OPEN]Where's Bessie? 贝西在哪呢

    P3671 [USACO17OPEN]Where's Bessie? 贝西在哪呢 题目背景 农夫John正在测试一个他新发明的全自动寻找奶牛无人机,它能够照一张农场的图片然后自动找出奶牛的位置. 不幸 ...

  8. [Angular] Short Imports with TypeScript Path Mapping

    The idea is change from: import {CoreModule} from '../core/core.module'; to: import {CoreModule} fro ...

  9. js时间格式化函数,支持Unix时间戳

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...

  10. 怎么样才算是精通 C++?

    C++是一门非常奇妙的语言.让人又爱又恨. 在知乎上看到的一个帖子.怎么样才算是精通C++,这里节选一些精彩的回复. 链接:http://www.zhihu.com/question/20201972 ...