/*
题意: 给出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. 【Effective C++ 读书笔记】条款04:确定对象使用前已先被初始化

    永远在使用对象之前先将它初始化.对于无任何成员的内置类型,你必须手工完成此事. 至于内置类型以外的任何其他东西,初始化责任落在构造函数身上.规则很简单:确保每一个构造函数都将对象的每一个成员初始化. ...

  2. 柱状图多系列php动态实现(ec)

    <?php require_once 'data.php'; $arr1=$a->sum('answer','ask_id=1'); $arr2=$a->sum('answer',' ...

  3. ios 苹果内购订单验证 --- php实现

    验证函数: function appleVerify($receipt_data,$orderId = 0) { /* * 21000 App Store不能读取你提供的JSON对象 * 21002 ...

  4. Linux下 VI 编辑器操作

    VI编辑器的三种模式:命令模式.输入模式.末行模式. 1.命令模式:vi启动后默认进入的是命令模式,从这个模式使用命令可以切换到另外两种模式,同时无论在何种模式下,[Esc]键都可以回到命令模式.在命 ...

  5. POJ:3040-Allowance(贪心好题)

    Allowance Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4903 Accepted: 1943 Description ...

  6. ansible-3

    setup ansible_all_ipv4_addresses # ipv4的所有地址 ansible_all_ipv6_addresses # ipv6的所有地址 ansible_date_tim ...

  7. cocos2d-x 3.0 Node与Node层级结构

    节点解释: 节点是场景图的基本元素.场景图的基本元素必须是节点对象或者是节点对象的子类. 其中主要可以看到Layer.MenuItem.Scene.Sprite.TMXTiledMap(解析and渲染 ...

  8. vue计算属性和观察者

    1. 计算属性 模板内的表达式非常便利,但在模板中放入太多的逻辑会让模板过重且难以维护,所有就有了计算属性 例子: //html代码 <div id="example"> ...

  9. python学习笔记十二:类的定义

    demo #!/usr/bin/python class Person: name = 'jim' age = 25 def say(self): print 'My name is ' + self ...

  10. C#向上转型与向下转型(转)

    原文地址:https://blog.csdn.net/wangqingbo0829/article/details/48474173 向上转型:将子类对象转为父类对象.此处父类对象可以是接口. 向下转 ...