/*
题意: 给出n个数(n<100000), 每个数都不大于100000,数字不会有重复。现在随意抽出3个,问三个彼此互质 或者 三个彼此不互质的数目有多少。
思路: 这道题反着想,就是三个数中只有一对互质 或者只有两对互质的个数。
研究后发现 对于每个数字求出与其不互质的个数k 那么 sum ( k*(n-1-k) )/2 就是相反的数目, 所以最终的答案就是 C(n,3) - sum ( k*(n-1-k) )/2.
*/
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std; typedef __int64 LL;
const int maxn=;
int prime[maxn],flag[maxn],num;
int numc[maxn*+],f[maxn*+];
int factor[],fac;
LL sum; void getprimes()
{
memset(flag,,sizeof(flag));
int i,j;num=;
for(i=;i<maxn;i++)
{
if(flag[i]) prime[num++]=i;
for(j=;j<num && prime[j]*i<maxn;j++)
{
flag[prime[j]*i]=;
if(i%prime[j]==) break;
}
}
} void dfs1(int now,int s)//找出它所有的因子
{
if(now==fac)
{
numc[s]++;
return ;
}
dfs1(now+,s);
dfs1(now+,s*factor[now]);
} void dfs2(int id,int all,int now,int s )
{
if(now==all)
{
sum+=numc[s];
return ;
}
if(id<fac)
{
dfs2(id+,all,now+,s*factor[id]);
dfs2(id+,all,now,s);
}
} void getfactors(int n)//分解质因子
{
int i;fac=;
for(i=;i<num && prime[i]<=n;i++)
{
if(n%prime[i]==)
{
factor[fac++]=prime[i];
while(n%prime[i]==) n/=prime[i];
}
}
if(n>) factor[fac++]=n;
} int main()
{
getprimes();
int t,n,i,j;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
memset(numc,,sizeof(numc));
for(i=;i<=n;i++)
{
scanf("%d",f+i);
getfactors(f[i]);
dfs1(,);
}
LL ans=;
for(i=;i<=n;i++)
{
getfactors(f[i]);
LL ret=,temp=;
for(j=;j<=fac;j++)//容斥原理找出与它不互质的个数
{
sum=;
dfs2(,j,,);
temp+=ret*sum;
ret=-ret;
}
if(temp==) continue;//当f[i]==1时,所有数都与它不互质的是0个
ans+=(temp-)*(n-temp);
}
printf("%I64d\n",(LL)n*(n-)*(n-)/-ans/);
}
return ;
}

hdu 5072 计数+容斥原理的更多相关文章

  1. hdu 5072 Coprime 容斥原理

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

  2. 集训队8月9日(组合计数+容斥原理+Mobius函数)

    刷题数:4 今天看了组合计数+容斥原理+Mobius函数,算法竞赛进阶指南169~179页 组合计数 https://www.cnblogs.com/2462478392Lee/p/11328938. ...

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

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

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

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

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

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

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

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

  7. hdu 5072 Coprime

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

  8. HDU 2461 Rectangles#容斥原理

    http://acm.hdu.edu.cn/showproblem.php?pid=2461 题目很简单,但是由于询问数M可以很大,所以容易超时,这道题学到了在结构体里面写函数的方法,这样子效率更高, ...

  9. HDU 1695 GCD#容斥原理

    http://acm.hdu.edu.cn/showproblem.php?pid=1695 翻译题目:给五个数a,b,c,d,k,其中恒a=c=1,x∈[a,b],y∈[c,d],求有多少组(x,y ...

随机推荐

  1. 解决方法:SQL Server 检测到基于一致性的逻辑 I/O 错误 校验和不正(转载)

    引用:http://luowei1371984.blog.163.com/blog/static/44041589201491844323885/ SQL2008运行select count(*) f ...

  2. 对Neural Machine Translation by Jointly Learning to Align and Translate论文的详解

    读论文 Neural Machine Translation by Jointly Learning to Align and Translate 这个论文是在NLP中第一个使用attention机制 ...

  3. python——int()函数

    1. 使用 int() 将小数转换为整数,结果是向上取整还是向下取整呢? 小数取整会采用比较暴力的截断方式,即向下取整.(注:5.5向上取整为6,向下取整为5) 2. 我们人类思维是习惯于“四舍五入” ...

  4. 1、spring boot入门

    1.Spring Boot 简介 简化Spring应用开发的一个框架: 整个Spring技术栈的一个大整合: J2EE开发的一站式解决方案: 2.微服务 2014,martin fowler 微服务: ...

  5. Go实现mqtt服务

    package main import ( "os" "log" "github.com/eclipse/paho.mqtt.golang" ...

  6. Wireshark 的使用

    Wireshark 默认无法查看 https, 需要设置一下 新建环境变量 SSLKEYLOGFILE, 值为一个想要保存 sshKey 的文件, 如新建一个空文件 D:\AppData\SshKey ...

  7. spark练习--mysql的读取

    前面我们一直操作的是,通过一个文件来读取数据,这个里面不涉及数据相关的只是,今天我们来介绍一下spark操作中存放与读取 1.首先我们先介绍的是把数据存放进入mysql中,今天介绍的这个例子是我们前两 ...

  8. shuffle的过程分析

    shuffle的过程分析 shuffle阶段其实就是之前<MapReduce的原理及执行过程>中的步骤2.1.多个map任务的输出,按照不同的分区,通过网络copy到不同的reduce节点 ...

  9. Tensorflor实现文本分类

    Tensorflor实现文本分类 下面我们使用CNN做文本分类 cnn实现文本分类的原理 下图展示了如何使用cnn进行句子分类.输入是一个句子,为了使其可以进行卷积,首先需要将其转化为向量表示,通常使 ...

  10. 有关ViewFlipper的使用及设置动画效果的讲解

    说到左右滑动,其实实现左右滑动的方式很多,有ViewPaer,自定义实现Viewgroup,gallery等都可以达到这种效果.这里做下ViewFliper实现左右滑动的效果. 会用到以下的技术: 1 ...