POJ 3904 Sky Code (容斥原理)
Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u
Description
Input
Output
Sample Input
4
2 3 4 5
4
2 4 6 8
7
2 3 4 5 7 6 8
Sample Output
1
0
34
题意:给定n个数,从n个数找出四个数,使这四个数的最大公约数为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的情况,相当于几
个集合求并集,这就需要容斥定理来做。
容斥原理应用,以2为因子的数有a个,3为因子 的数有b个,6为因子的数有c个,
n个数不互质的四元组个数为C(a,4)+C(b,4)-C(c,4) (含奇数个素因子的加,偶数个素因子的减),
下面就是统计出2,3,5这些因子的倍数的个数,对C(a,4)容斥!
代码:弄清思路以后就很好做了,一环扣一环,用二进制进行枚举,很棒!
#include <iostream>
#include <cstring>
#include <cmath>
#include <cstdio>
using namespace std;
const int maxn=1e4+;
typedef long long ll; //因为c(5000,4)=26010428123750。所以要用 long long 能long long 就 long long
ll c(ll n)
{
return n*(n-)*(n-)*(n-)/;
}
ll prime[],cnt=,num[maxn][]; //0代表数目 1代表奇偶性
void solve(ll n)
{
//memset(prime,0,sizeof(prime)); //这句话和cin同时用会超时 所以涉及到复杂度全用scanf
cnt=;
for(int i=;i<=sqrt(n);i++)
{
if(n%i==)
{
prime[cnt++]=i;
while(n%i==)
n/=i;
}
}
if(n!=)
prime[cnt++]=n; //这里一定注意是n不是i
for(int i=;i<(<<cnt);i++) //i=0无意义 num[1][] 无意义
{
ll flag=,tmp=;
for(int j=;j<cnt;j++)
{
if(i&(<<j))
{
flag++;
tmp*=prime[j];
}
}
//其实这里可以优化一下 若大于2500的数作为因子 他的倍数不可能够四个的
//不过是否优化对时间无影响
num[tmp][]++; //数目
num[tmp][]=flag;//奇偶性
}
}
int main()
{
ll n,data;
while(scanf("%lld",&n)!=EOF) //是lld
{
memset(num,,sizeof(num));
for(int i=;i<n;i++)
{
scanf("%lld",&data);
solve(data);
}
ll ans=c(n);
for(int i=;i<=maxn/;i++)
{
if(num[i][]) //0代表数目
{
if(num[i][]&) //1代表flag奇偶性
ans-=c(num[i][]); //注意这里用的是数目
//不是num[i][1] 更不是num[1]什么 是num[i][0]
else
ans+=c(num[i][]);
}
}
printf("%lld\n",ans);
}
return ;
}
POJ 3904 Sky Code (容斥原理)的更多相关文章
- [poj 3904] sky code 解题报告(组合计算+容斥原理)
题目链接:http://poj.org/problem?id=3904 题目大意: 给出一个数列,询问从中取4个元素满足最大公约数为1的方案数 题解: 很显然,ans=总的方案数-最大公约数大于1的4 ...
- POJ 3904 Sky Code
题意:给定n个数ai, ai <= 10000, n <= 10000, 从中选出4个数要求gcd为1,这样的集合有多少个? 分析:首先总共集合nCr(n, 4) = n*(n-1)*(n ...
- poj3904 Sky Code —— 唯一分解定理 + 容斥原理 + 组合
题目链接:http://poj.org/problem?id=3904 Sky Code Time Limit: 1000MS Memory Limit: 65536K Total Submiss ...
- POJ Sky Code 莫比乌斯反演
N. Sky Code Time Limit: 1000ms Case Time Limit: 1000ms Memory Limit: 65536KB 64-bit integer IO for ...
- POJ 3904(容斥原理)
Sky Code Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 1750 Accepted: 545 Descripti ...
- poj 3904(莫比乌斯反演)
POJ 3904 题意: 从n个数中选择4个数使他们的GCD = 1,求总共有多少种方法 Sample Input 4 2 3 4 5 4 2 4 6 8 7 2 3 4 5 7 6 8 Sample ...
- Sky Code
Sky Code 给出n个数,求选出4个数组合,使其gcd为1,,\(n<=10000\),每个数\(<=10000\). 解 理解1:容斥原理 注意到Mobius反演式子不好写出,于是我 ...
- Sky Code(poj3904)
Sky Code Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 2085 Accepted: 665 Descripti ...
- POJ3904 Sky Code
题意 Language:Default Sky Code Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 3980 Accepte ...
随机推荐
- mysql实用教程的数据构造
create database XSCJ; use XSCJ; create table XS ( 学号 ) primary key not null, 姓名 ) not null, 专业名 ), 性 ...
- 【poj1113】 Wall
http://poj.org/problem?id=1113 (题目链接) 题意 给定多边形城堡的n个顶点,绕城堡外面建一个围墙,围住所有点,并且墙与所有点的距离至少为L,求这个墙最小的长度. Sol ...
- Uva11134 Fabled Rooks
普通的贪心题. 虽然图是二维的,但可以把横向和纵向分开处理. 将区间按右端点排序,然后从区间左端点到右端点找第一个空位置放棋子即可. /*by SilverN*/ #include<algori ...
- HD1847 Good Luck in CET-4 Everybody!(巴什博弈)
巴什博弈: 一堆物品n个,最多取m个,最少取1个,最后取走的人获胜 分析:只要保证取玩最后剩m+1个,则必定胜利,所以构造m+1,只要n是 m+1的倍数,则先手必败,每次先手取玩,后手可取使得剩下的仍 ...
- FluentData,它是一个轻量级框架,关注性能和易用性。
http://www.cnblogs.com/zengxiangzhan/p/3250105.html FluentData,它是一个轻量级框架,关注性能和易用性. 下载地址:FlunenData.M ...
- 修改MYSQL 表中的字段属性
1.登录数据库 >mysql -u root -p 数据库名称 2.查询所有数据表 >show tables; 3.查询表的字段信息 >desc 表名称; 4.1.修改某个表的字段类 ...
- Linux下不同机器之间的文件拷贝
通过 scp 命令实现不同机器之间的文件拷贝. (1)本机考到目标机器:scp 本机文件 目的地: 如:scp /home/odp-web.war root@192.168.6.137:/usr/ ...
- Android SDK安装Android4.0“冰激淋三明治”(IceCreamSandwich)教程(转载)
昨天,Google举行了发布会,发布了Nexus Prime手机和Android4.0-IceCreamSandwich手机系统.作为Google旗下Android的最新版本手机系 统,Android ...
- 关于31天App教程示例中一些因SDK版本而出现的问题(转)
由于国外那个知名的31天案例教程比较老,所用官方API是2008年时的2.X,所以在现在的Xcode3-4之后或多或少都有编译警告和错误信息.必须做些适应iOS版本的代码更改才能顺利编译通过. Day ...
- 最长公共子序列(LCS)
简单的DP. f[i][j]表示序列a中前i个中,序列b中前b个中,组成的最长公共子序列的长度. DP方程: if(a[i-1]==b[j-1]) f[i][j]=f[i-1][j-1]+1; el ...