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 ...
随机推荐
- 【poj3348】 Cows
http://poj.org/problem?id=3348 (题目链接) 题意 给出平面上n个点,以这n个点中的一些围成的多边形面积 div 50的最大值. Solution 凸包求面积. 很好做, ...
- .net Int16 、(int Int32)、 Int64 的区别
关于什么是16位整数,32位整数,64位整数,请看这里:http://www.cnblogs.com/EasonJim/p/4837061.html Int16 值类型表示值介于 -32768 到 + ...
- C#文件复制功能
目的是将用户自定义文件复制到指定文件夹并且能查看该文件,下面是个人做的源码: sing System; using System.Collections.Generic; using System.C ...
- 轻量级应用开发之(02)UIView
一 控件 1.屏幕上的所有UI元素都叫做控件(也有叫做视图.组件)比如按钮(UIButton).文本(UILabel)都是控件. 2.控件的共同属性有哪些? 尺寸,位置,背景色 3. 苹果将控件的共同 ...
- 初学Hibernate持久化
hibernate三种持久化对象状态:(持久化对象:Persistent Object=POJO + hbm映射) 1.瞬时状态(临时状态或自由态):PO对象刚创建(即new)开始进入瞬时状态,此时对 ...
- c/c++细节知识整理
这篇文章总结了部分c/c++琐碎的细节知识. 目录如下: (一)bool类型 知识点出处较多,无法一一列举,向原作者致敬. (一)bool类型 在c99标准以前,c语言并没有定义bool类型.如果需要 ...
- mysql zip 版本配置方法
-\bin 指 C:\Program Files\MySQL\MySQL Server 5.6\bin 1.增加环境变量 "PATH"-"-\bin" 2.修改 ...
- Oracle 11g r2 x64 中文乱码解决方案
1.检查服务器编码: 执行SQL语法: select * from v$nls_parameters; 2.设置本地客户端编码: 进入 我的电脑,属性,高级,环境变量,添加2项:LANG=zh_CN. ...
- WPF RichTextBox的使用总结
RichTextBox内容模型 RichTextBox 支持基于块的内容模型. RichTextBox 的内容属性为 Blocks,这是 Paragraph 元素的集合Paragraph元素可包含 ...
- Ajax相同url的请求,IE缓存问题
最近做一个小项目,其中的一个页面如下,需要实现异步改变“是否推荐”的状态. 请求的代码如下: $.get("/Contorller/Edit", { id: id }, funct ...