/*
题意: 给出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 ;
}

最新文章

  1. JVM实用参数(五)新生代垃圾回收
  2. Python模块:collections
  3. IO调度器
  4. iOS: ARC &amp; MRC下string内存管理策略探究
  5. jqXHR 对象(post完成后再调用函数)
  6. spring获取webapplicationcontext,applicationcontext几种方法详解
  7. git ssh key for github
  8. Linux文件查找命令find用法整理(locate/find)
  9. AudioServicesPlaySystemSound音频服务—b
  10. 【iOS】7.4 定位服务-&gt;2.1.3.3 定位 - 官方框架CoreLocation 功能3:区域监听
  11. 【Spark2.0源码学习】-9.Job提交与Task的拆分
  12. 50个Java多线程面试题(上)
  13. MySql join on 和 where
  14. win10出现&quot;本地计算机上的MySQL57服务启动后停止&quot;
  15. Effective Java 第三版——14.考虑实现Comparable接口
  16. form表单序列化为Jquery对象
  17. list转换string
  18. [osgearth][原]仿照谷歌,修改oe漫游器中focal(视角切换)功能
  19. 三种简单排序算法(java实现)
  20. javascript计算字符串长度

热门文章

  1. scrapy--boss直聘
  2. 笔记-python操作mysql
  3. TouTiao开源项目 分析笔记7 加载数据的过程
  4. android 文件下载 超简单
  5. Android学习记录(1)—Android中XML文件的序列化生成与解析
  6. Python 实现随机打乱字符串
  7. 抓包工具 - Fiddler - (二)
  8. SQL面试题:之一(难度:中等)
  9. Python处理Sqlite3数据库
  10. 条件随机场(Conditional random field)