http://acm.hdu.edu.cn/showproblem.php?pid=5072

题意:给出 n 个互不相同的数,求满足以下条件的三元无序组的个数:要么两两互质要么两两不互质。

思路:根据同色三角形原理求,白书105页。求它不符合条件的情况数,先对每一个数分解质因子,然后利用容斥求出与这个数不互质的数的个数,那么不符合条件的的情况数加上(x-1)*(n-x);  x为其它数与这个数不互质的个数。最后总的情况数减去不符合的情况数,剩下的就是答案。再求多少个是这个数的倍数的时候,可以用筛法求出。

 #include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
#define maxn 100010
using namespace std; int t,n;
int a[maxn+];
int num[maxn+];
int cnt[maxn+];
vector<int>g; int main()
{
scanf("%d",&t);
while(t--)
{
memset(cnt,,sizeof(cnt));
memset(num,,sizeof(num));
scanf("%d",&n);
for(int i=; i<n; i++)
{
scanf("%d",&a[i]);
num[a[i]]++;
}
for(int i=; i<=maxn; i++)
{
for(int j=i; j<=maxn; j+=i)
{
cnt[i]+=num[j];
}
}
__int64 ans=;
for(int i=; i<maxn; i++)
{
if(num[i])
{
int m=i;
g.clear();
for(int j=; j*j<=i; j++)
{
if(m%j==)
{
g.push_back(j);
while(m%j==) m/=j;
}
}
if(m>) g.push_back(m);
int x=(int) g.size();
int cc=;
for(int j=; j<(<<x); j++)
{
int t2=;
int xx=;
for(int k=; k<x; k++)
{
if((<<k)&j)
{
t2++;
xx*=g[k];
}
}
if(t2%) cc+=cnt[xx];
else cc-=cnt[xx];
}
ans+=(__int64)max(cc-,)*(n-cc);
}
}
__int64 t1=(__int64)n*(n-)*(n-)/;
printf("%I64d\n",t1-ans/);
}
return ;
}

hdu 5072 Coprime的更多相关文章

  1. HDU 5072 Coprime (单色三角形+容斥原理)

    题目链接:Coprime pid=5072"> 题面: Coprime Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: ...

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

    pid=5072">http://acm.hdu.edu.cn/showproblem.php?pid=5072 单色三角形模型 现场赛和队友想了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 (容斥)

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

  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(容斥+同色三角形)

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

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

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

  8. [容斥原理] hdu 4135 Co-prime

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4135 Co-prime Time Limit: 2000/1000 MS (Java/Others) ...

  9. hdu 5072 两两(不)互质个数逆向+容斥

    http://acm.hdu.edu.cn/showproblem.php?pid=5072 求n个不同的数(<=1e5)中有多少组三元组(a, b, c)两两不互质或者两两互质. 逆向求解,把 ...

随机推荐

  1. hdu 4742 Pinball Game 3D 分治+树状数组

    离散化x然后用树状数组解决,排序y然后分治解决,z在分治的时候排序解决. 具体:先对y排序,solve(l,r)分成solve(l,mid),solve(mid+1,r), 然后因为是按照y排序,所以 ...

  2. [ACM] HDU 5025 Saving Tang Monk (状态压缩,BFS)

    Saving Tang Monk Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  3. iOS IAP教程

    1. 创建应用 首先进入iTunes Connect然后按下 Manage Your Applications 接下来按下Add New Applicationbutton创建应用 2. 在应用中创建 ...

  4. mysql 时区 , 夏令时,冬令时

    mysql默认时区: mysql> show variables like '%time_zone%'; +------------------+--------+ | Variable_nam ...

  5. viewController启动方法分析

    viewController启动方法分析 转载:http://blog.csdn.net/dizzthxl/article/details/14170047 首先理清楚一个概念: 创建一个类和实例化一 ...

  6. xcode升级或者重新安装后不能编译的解决方法

    昨天由于xcode有一些问题,因此进行了重新安装,结果安装好后进行编译,没有进行任何改动的代码出现了两个fatal error 查看错误信息为什么的header has allready build, ...

  7. oracle数组定义与使用

    定义固定长度的一维数组 type type_array is varray(10) of varchar2(20); 1.varray(10)表示定义长度为10的数组 2.varchar2(20)表示 ...

  8. IEqualityComparer 去重

    1.去除list里某重复字段值的数据(相当于group by) public class CorrController { //方法 public void DoGet() { List<tes ...

  9. Eclipse从数据库逆向生成Hibernate带注解的实体类

    http://www.2cto.com/database/201501/372023.html

  10. 『重构--改善既有代码的设计』读书笔记----Hide Delegate

    所谓委托关系,就是一个类对于另一个类来说纯粹作为接口转发,即客户通过一个委托类去调用另一个对象.直白的委托关系就是委托类直接返回出目标类给客户调用,这个关系很麻烦,因为委托关系的变动就会影响客户端的代 ...