您的位置:首页 > 其它

hdu 5072(容斥原理)

2014-10-31 12:28 162 查看
#include<iostream>
#include<sstream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#include<map>
#include<time.h>
#include<set>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
#define inf 0x7fffffff
#define lc l,m,index<<1
#define rc m+1,r,index<<1|1
#define max_n 100005
#define mod 10000007
#define FOR(i,s,t) for(int i=(s);i<=(t);++i)
#define LL __int64
int T;
int cnt[max_n];//因子为i的数的个数
int a[max_n];
vector<int>tmp;
int main()
{
scanf("%d",&T);
while(T--)
{
memset(a,0,sizeof(a));
memset(cnt,0,sizeof(cnt));
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
int x;
scanf("%d",&x);
a[x]++;
}
for(int i=2;i<=100000;i++)
{
for(int j=i;j<=100000;j+=i)
cnt[i]+=a[j];
}
long long ans=0;
for(int i=2;i<=100000;i++)
{
if(a[i])
{
tmp.clear();
int u=(int)sqrt(i);
int t=i;
for(int j=2;j<=u;j++)
{
if(t%j==0)
{
tmp.push_back(j);
while(t%j==0) t/=j;
}
if(t<=1)break;
}
if(t>1)tmp.push_back(t);
int v=tmp.size();
if(v==0)continue;
int nn=1<<v;
int num=0;

for(int j=0;j<nn;j++)
{
int flag=0;int mul=1;
for(int l=0;l<v;l++)
{
if((j>>l)&1)
{
flag++;
mul*=tmp[l];
}
}
if(flag&1)num+=cnt[mul];
else
num-=cnt[mul];
}
ans+=(long long)max(0,(num-1))*(n-num);
}
}
printf("%I64d\n",(long long)n*(n-1)*(n-2)/6-ans/2);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: