题目链接:Coprime

pid=5072">

题面:

Coprime

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)

Total Submission(s): 1181    Accepted Submission(s): 471

Problem Description
There are n people standing in a line. Each of them has a unique id number.



Now the Ragnarok is coming. We should choose 3 people to defend the evil. As a group, the 3 people should be able to communicate. They are able to communicate if and only if their id numbers are pairwise coprime or pairwise not coprime. In other words, if their
id numbers are a, b, c, then they can communicate if and only if [(a, b) = (b, c) = (a, c) = 1] or [(a, b) ≠ 1 and (a, c) ≠ 1 and (b, c) ≠ 1], where (x, y) denotes the greatest common divisor of x and y.



We want to know how many 3-people-groups can be chosen from the n people.
 
Input
The first line contains an integer T (T ≤ 5), denoting the number of the test cases.



For each test case, the first line contains an integer n(3 ≤ n ≤ 105), denoting the number of people. The next line contains n distinct integers a1, a2, . . . , an(1 ≤ ai ≤ 105) separated by
a single space, where ai stands for the id number of the i-th person.
 
Output
For each test case, output the answer in a line.
 
Sample Input
1
5
1 3 9 10 2
 
Sample Output
4
 
Source
2014 Asia AnShan Regional Contest



解题:

    题意求找出三数互质或都不互质的组数,直接肯定不行。

此题原型为单色三角形,结果为C(3,n)-res,当中res为每一个与每一个数互质和不互质数量的乘积的累加。求与每一个数不互质的数量,用到了容斥原理。看似简单的原理应用却这么广泛,假设没做过容斥原理的题目,能够先试一下HDU 1796。

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
bool status[100010];
int factor[100010][8];
int store[100010],cnt[100010];
long long ans[100010],res;
int one_amount[300];
int refl[300][8];
int cal[8];
void prep()
{
memset(refl,0,sizeof(refl));
int cont=0,temp;
for(int i=0;i<256;i++)
{
temp=i;
one_amount[i]=cont=0;
while(temp)
{
if(temp%2)
{
one_amount[i]++;
refl[i][cont]=1;
}
cont++;
temp/=2;
}
}
}
bool is_prime(int a)
{
if(a<=3)return true;
int x=sqrt(1.0*a);
for(int i=2;i<=x;i++)
{
if(a%i==0)
return false;
}
return true;
}
long long C(int x,int y)
{
long long res=1;
for(int i=1;i<=x;i++)
{
res=res*(y-i+1)/i;
}
return res;
}
int main()
{
int t,n,p,tmp;
long long temp;
scanf("%d",&t);
prep();
while(t--)
{
res=0;
memset(status,0,sizeof(status));
memset(factor,0,sizeof(factor));
memset(cnt,0,sizeof(cnt));
memset(ans,0,sizeof(ans));
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&store[i]);
for(int i=0;i<n;i++)
status[store[i]]=1;
for(int i=2;i<=100000;i++)
{
if(is_prime(i))
{
for(int j=i;j<=100000;j+=i)
{
if(status[j])
{
cnt[i]++;
}
p=0;
while(factor[j][p])
{
p++;
}
factor[j][p]=i;
}
}
else
{
for(int j=i;j<=100000;j+=i)
{
if(status[j])
{
cnt[i]++;
}
} }
}
for(int i=0;i<n;i++)
{
tmp=store[i];
p=0;
while(factor[tmp][p])
{
cal[p]=factor[tmp][p];
p++;
}
if(p==0)
{
ans[i]=0;
continue;
}
tmp=1<<p;
for(int j=1;j<tmp;j++)
{
temp=1;
for(int k=0;k<p;k++)
{
if(refl[j][k])
{
temp=temp*cal[k];
}
}
if(one_amount[j]%2)
ans[i]+=cnt[temp];
else
ans[i]-=cnt[temp];
}
ans[i]-=1;
}
for(int i=0;i<n;i++)
{
res+=(ans[i]*(n-ans[i]-1));
}
res/=2;
printf("%I64d\n",C(3,n)-res);
}
return 0;
}

总结:

用好容斥原理的关键在于,搞清楚集合的交的含义。

 

HDU 5072 Coprime (单色三角形+容斥原理)的更多相关文章

  1. hdu 5072 Coprime(同色三角形+容斥)

    pid=5072">http://acm.hdu.edu.cn/showproblem.php?pid=5072 单色三角形模型 现场赛和队友想了3个小时,最后发现想跑偏了.感觉好可惜 ...

  2. HDU 5072 Coprime 同色三角形问题

    好吧,我承认就算当时再给我五个小时我也做不出来. 首先解释同色三角形问题: 给出n(n >= 3)个点,这些点中的一些被涂上了红色,剩下的被涂上了黑色.然后将这些点两两相连.于是每三个点都会组成 ...

  3. hdu 5072 Coprime 容斥原理

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total Submissio ...

  4. Hdu 5072 Coprime(容斥+同色三角形)

    原题链接 题意选出三个数,要求两两互质或是两两不互质.求有多少组这样的三个数. 分析 同色三角形n个点 每两个点连一条边(可以为红色或者黑色),求形成的三条边颜色相同的三角形的个数反面考虑这个问题,只 ...

  5. ACM学习历程—HDU 5072 Coprime(容斥原理)

    Description There are n people standing in a line. Each of them has a unique id number. Now the Ragn ...

  6. hdu 5072 Coprime

    http://acm.hdu.edu.cn/showproblem.php?pid=5072 题意:给出 n 个互不相同的数,求满足以下条件的三元无序组的个数:要么两两互质要么两两不互质. 思路:根据 ...

  7. hdu 5072 Coprime (容斥)

    Problem Description There are n people standing in a line. Each of them has a unique id number. Now ...

  8. Coprime (单色三角形+莫比乌斯反演(数论容斥))

    这道题,先说一下单色三角形吧,推荐一篇noip的论文<国家集训队2003论文集许智磊> 链接:https://wenku.baidu.com/view/e87725c52cc58bd631 ...

  9. 单色三角形(hdu-5072

    单色三角形模型:空间里有n个点,任意三点不共线.每两个点之间都用红色或者黑色线段链接.如果一个三角形的三条边同色,责成这个三角形是单色三角形.对于给定的红色线段列表,找出单色三角形的个数. 分析:对于 ...

随机推荐

  1. 洛谷 P2374 搬运工

    P2374 搬运工 题目背景 陈老师喜欢网购书籍,经常一次购它个百八十本,然后拿来倒卖牟取暴利.(ps:描述要看懂) 题目描述 前些天,高一的新同学来了,他便像往常一样兜售他的书,经过一番口舌,同学们 ...

  2. CMake编译Makefile

    以编译Libtif文件为例: 你可以用CMake编译libtiff,超简单,两个步骤. 参考文章 CharlesSimonyi,libtiff库的问题的答复

  3. nuxt.js配置BASE_URL(基本域名)和NODE_ENV(环境变量)

    一直以来,开发环境和生产环境的数据接口域名不一样总是困扰着我 每次打测试包或者线上包,我都得手动切换域名,我相信很多人的做法跟这差不多,类似下面这样: (你已经注意到,这个文件已经被我无情的删除了,因 ...

  4. 日历控件input框默认显示当日日期

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <script sr ...

  5. 原生js大总结九

    81.ES6的Symbol的作用是什么?   ES6引入了一种新的原始数据类型Symbol,表示独一无二的值   82.ES6中字符串和数组新增了那些方法   字符串       1.字符串模板    ...

  6. 洛谷 P1230 智力大冲浪

    洛谷 P1230 智力大冲浪 题目描述 小伟报名参加中央电视台的智力大冲浪节目.本次挑战赛吸引了众多参赛者,主持人为了表彰大家的勇气,先奖励每个参赛者m元.先不要太高兴!因为这些钱还不一定都是你的?! ...

  7. [D3] Creating a D3 Force Layout in React

    Learn how to leverage d3's layout module to create a Force Layout inside of React. We'll take a look ...

  8. 策略模式 VS 桥梁模式

    这对冤家终于碰头了,策略模式与桥梁模式是如此相似,简直就是孪生兄弟,要把它们两个分开需要花费大量智力,我们来看看两者的通用类图,如图33-1所示. 图33-1 策略模式(左)和桥梁模式(右)通用类图 ...

  9. Java核心技术 卷Ⅰ 基础知识(5)

    第11章 异常.断言.日志和调试 处理错误 异常分类 声明已检查异常 如何抛出异常 创建异常类 捕获异常 捕获多个异常 再次抛出异常与异常链 finally子句 带资源的try语句 分析堆栈跟踪元素 ...

  10. springmvc+shiro+freemarker实现的安全及权限管理

    本文讲述了基于springmvc+shiro实现安全管理,shiro+freemarker实现权限验证. 首先我们从web.xml开始: <?xml version="1.0" ...