hdu 5072

题意: 求有多少的3元祖,并且每个3元组彼此互质或者不互质,求这样的3元组的个数:

转化为求的n个数中与x互质的数有多少个,可以用容斥原理来做

总结: 一般求因子的倍数的个数,都是用容斥原理

#include<iostream>
#include<vector>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define LL __int64
const int maxn = 1e5+8;
LL a[maxn],cn,numpri[maxn],vis[maxn],dis[maxn];
LL n,m;
LL f[maxn];
void getprim(){
    cn = 0;
    for(LL i=2;i<1000;i++){
        if(!dis[i]){
            numpri[cn++] = i;
            for(LL j=2*i;j<=1000;j+=i)
                dis[j] = 1;
        }
    }
}
LL getans(){
    vector <int > v;

    LL ans1 = 0;
    for(LL i=0;i<n;i++){
            v.clear();
        LL d = a[i],sum = 0;;
        for(LL j=0;j<cn&&numpri[j] * numpri[j] <=d;j++){
            if(d % numpri[j] == 0){
                v.push_back(numpri[j]);
                while(d % numpri[j] == 0)d /= numpri[j];
            }
        }
        if(d!=1)v.push_back(d);
        int len = v.size();
        //cout << len <<endl;
        for(int j=0;j<(1<<len);j++){
            LL op =0,ans = 1;
            for(int k=0;k<len;k++){
                if((1<<k)&j){
                    op++;
                    ans*=v[k];
                }
            }
            if(op&1)sum+=f[ans];
            else sum -= f[ans];
        }
        if(sum <= 0) continue;
        ans1 += (sum - 1) *(n-sum);
    }
    return ans1 /2;
}

int main(){
    LL T;
    scanf("%I64d",&T);
      getprim();
    while(T--){
        memset(f,0,sizeof(f));
        memset(vis,0,sizeof(vis));
        scanf("%I64d",&n);
        for(LL i=0;i<n;i++){
            scanf("%I64d",&a[i]);
            vis[a[i]] = 1;
        }
        for(int i=2;i<maxn;i++){
            for(int j=i;j<maxn;j+=i){
                if(vis[j])f[i]++;
            }
        }
        LL ans = n*(n-1)*(n-2)/6;
        ans -= getans();
        cout << ans<<endl;
    }
}
时间: 2024-10-25 03:04:14

hdu 5072的相关文章

hdu 5072 Coprime(数论)

题目链接:hdu 5072 Coprime 题目大意:给定N个数,问能选出多少个3元组,要么[(a, b) = (b, c) = (a, c) = 1] or [(a, b) ≠ 1 and (a, c) ≠ 1 and (b, c) ≠ 1]. 解题思路:这题可以换个角度想,可以将三个数看做三角形的三条边,互质即边的颜色为1,否则为0,那么要求的即为 三条边颜色相同的三角形有多少个. 总的三角形的个数可求,那么如果求出三条边不完全相同的三角形个数,相减一下即可. 枚举顶点,然后确定以该点形成的

2014 ACM Regional hdu 5072

ACM退役两年了, 没想到今年机缘巧合能去鞍山参加Regional了. 记得第一次参加Regional的时候那个心情很激动,激动的很难描述出来.而这次参加Regional一点压力都木有,感觉比参加省赛都轻松,甚至就像是在做练习赛似的.由于本来水平就不高,又隔了两年,所以毫无悬念地拿了个铜牌. 比赛时候C题基本已经想到了解法,由于时间的原因,没能过掉. C题现在在hdu的5072题. 题意: 给出n个数(n<100000), 每个数都不大于100000,数字不会有重复.现在随意抽出3个,问三个彼此

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

pid=5072">http://acm.hdu.edu.cn/showproblem.php?pid=5072 单色三角形模型 现场赛和队友想了3个小时,最后发现想跑偏了.感觉好可惜的一道题,要是知道这个模型....就能够轻松的拿银了啊. . . 题意不再赘述,就是求同色三角形的个数.总的三角形的个数是C(n,3),仅仅需减去不同色的三角形就可以.对于每一个点(数),与它互质的连红边,不互质的连蓝边,那么对于该点不同色三角形个数为蓝边数*红边数/2,由于同一个三角形被计算了两次. 那么同

HDU 5072 Coprime (莫比乌斯反演+容斥+同色三角形)

Coprime Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Total Submission(s): 1469    Accepted Submission(s): 579 Problem Description There are n people standing in a line. Each of them has a unique id number. Now

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

题目链接:Coprime 题面: Coprime Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Total Submission(s): 1181    Accepted Submission(s): 471 Problem Description There are n people standing in a line. Each of them has a uniq

hdu 5072 Coprime

Coprime Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total Submission(s): 56    Accepted Submission(s): 20 Problem Description There are n people standing in a line. Each of them has a unique id number. Now the

HDU 5072 Coprime 同色三角形问题

好吧,我承认就算当时再给我五个小时我也做不出来. 首先解释同色三角形问题: 给出n(n >= 3)个点,这些点中的一些被涂上了红色,剩下的被涂上了黑色.然后将这些点两两相连,于是每三个点都会组成一个三角形, 即总共有sum = C(3,n)个三角形.对于一个三角形,如果三个点颜色一样则称其为同色三角形. 那么一个很直观的思路就是容斥,sum - 非同色三角形个数ans. ans = (sigma (Xi*Yi) ) / 2;(1 <= i <= n,Xi,Yi分别表示与第 i 个点相连的

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

Description There are n people standing in a line. Each of them has a unique id number. Now the Ragnarok is coming. We should choose 3 people to defend the evil. As a group, the 3 people should be able to communicate. They are able to communicate if

hdu 5072 计数+容斥原理

/* 题意: 给出n个数(n<100000), 每个数都不大于100000,数字不会有重复.现在随意抽出3个,问三个彼此互质 或者 三个彼此不互质的数目有多少. 思路: 这道题的原型是同色三角形, 可能现场很多队伍都知道这个模型, 所以这道题当时过的队伍还是挺多的. 这道题反着想,就是三个数中只有一对互质 或者只有两对互质的个数. 研究后发现 对于每个数字求出与其不互质的个数k 那么 sum ( k*(n-1-k) )/2 就是相反的数目, 所以最终的答案就是 C(n,3) - sum ( k*