POJ3904 Sky Code【容斥原理】
题目链接:
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【容斥原理】的更多相关文章
- poj3904 Sky Code —— 唯一分解定理 + 容斥原理 + 组合
题目链接:http://poj.org/problem?id=3904 Sky Code Time Limit: 1000MS Memory Limit: 65536K Total Submiss ...
- POJ 3904 Sky Code (容斥原理)
B - Sky Code Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit ...
- POJ3904 Sky Code
题意 Language:Default Sky Code Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 3980 Accepte ...
- [poj3904]Sky Code_状态压缩_容斥原理
Sky Code poj-3904 题目大意:给你n个数,问能选出多少满足题意的组数. 注释:如果一个组数满足题意当且仅当这个组中有且只有4个数,且这4个数的最大公约数是1,$1\le n\le 10 ...
- Sky Code(poj3904)
Sky Code Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 2085 Accepted: 665 Descripti ...
- Sky Code
Sky Code 给出n个数,求选出4个数组合,使其gcd为1,,\(n<=10000\),每个数\(<=10000\). 解 理解1:容斥原理 注意到Mobius反演式子不好写出,于是我 ...
- POJ Sky Code 莫比乌斯反演
N. Sky Code Time Limit: 1000ms Case Time Limit: 1000ms Memory Limit: 65536KB 64-bit integer IO for ...
- POJ3094 Sky Code(莫比乌斯反演)
POJ3094 Sky Code(莫比乌斯反演) Sky Code 题意 给你\(n\le 10^5\)个数,这些数\(\le 10^5\),问这些这些数组成的互不相同的无序四元组(a,b,c,d)使 ...
- [poj 3904] sky code 解题报告(组合计算+容斥原理)
题目链接:http://poj.org/problem?id=3904 题目大意: 给出一个数列,询问从中取4个元素满足最大公约数为1的方案数 题解: 很显然,ans=总的方案数-最大公约数大于1的4 ...
随机推荐
- Uva 1605 Building for UN【构造法】
题意:给出n个国家,给它们分配办公室,使得任意两个国家都有一对相邻的格子 看的紫书,最开始看的时候不理解 后来还是搜了题解--- 发现是这样的 比如说5个国家 应该输出 AAAA BBBB CCCC ...
- 解析浏览器和nodejs环境下console.log()的区别
写在前面的 在开发调试过程中,我们经常需要调用console.log 方法来打印出当前变量的值,然而,console.log在浏览器环境下 有时会出现一些异常的现象 开撸代码 在浏览器和nodejs环 ...
- IPv6第二层寻址,IPv6接口要求
1. IPv6第二层寻址 IPV6地址以两种方式与第2层地址相关.第一种方式是IPV6独有的,提供了从第2层地址构建接口ID的机制.第二种方式对IPv4和IPV6都是一样的,提供了将一个IP组播地址映 ...
- Centos 7 iptables 开放端口
MySQL 开放远程连接时, 已经打开了对应端口的安全组发现还是连接不上, 那么就需要 check 一下防火墙端口是否开放. firewall-cmd --zone=public --query-po ...
- 2017-2-10 bash基础脚本
练习:写一脚本,实现如下功能: 1.让用户通过键盘输入一个用户名,如果用户不存在就退出: 2.如果其UID等于其GID,就说它是个"good guy" 3.否则,就说它是个“bad ...
- POJ-3348 Cows 计算几何 求凸包 求多边形面积
题目链接:https://cn.vjudge.net/problem/POJ-3348 题意 啊模版题啊 求凸包的面积,除50即可 思路 求凸包的面积,除50即可 提交过程 AC 代码 #includ ...
- [BZOJ3673&3674]可持久化并查集&加强版
题目大意:让你实现一个可持久化的并查集(3674强制在线). 解题思路:刚刚介绍了一个叫rope的神器:我是刘邦,在这两题(实际上两题没什么区别)就派上用场了. 正解应该是主席树||可持久化平衡树,然 ...
- KVM 日常使用命令
[root@Eren liwm]# ps ax | grep kvm 681 ? S< 0:00 [kvm-irqfd-clean]17597 pts/0 S+ ...
- 紫书 习题8-12 UVa 1153(贪心)
本来以为这道题是考不相交区间, 结果还专门复习了一遍前面写的, 然后发现这道题的区间是不是 固定的, 是在一个范围内"滑动的", 只要右端点不超过截止时间就ok. 然后我就先考虑有 ...
- Google的10大座右铭
1. 以用户为中心,其他一切纷至沓来. 创建伊始,Google 即以提供最佳的用户体验为其中心任务.虽然很多公司主张客户利益优先,但难以抗拒各种诱惑,往往会牺牲客户的少量利益来增加股东价值. Goog ...