hdu4135(容斥,同色三角形模型)

传送门

解答传送门

ac代码(位运算实现容斥原理):

#include<bits/stdc++.h>
#define per(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
typedef long long ll;
//#define int long long
const ll inf =2333333333333333LL;
const double eps=1e-8;
int read(){
    char ch=getchar();
    int res=0,f=0;
    while(ch<‘0‘ || ch>‘9‘){f=(ch==‘-‘?-1:1);ch=getchar();}
    while(ch>=‘0‘&&ch<=‘9‘){res=res*10+(ch-‘0‘);ch=getchar();}
    return res*f;
}
// ------------------------head
#define mod 1000000007
const int N=100005;
int T,n,a[N],fac[N][10],fcnt[N],prime[N],pcnt,num[N];
bool Notprime[N];
void prime_sieve(){//线性筛
    memset(Notprime,false,sizeof(Notprime));
    pcnt=0;
    for(int i=2;i<=1000;i++){
        if(!Notprime[i])prime[pcnt++]=i;
        for(int j=0;j<pcnt&&i*prime[j]<=1000;j++){
            Notprime[i*prime[j]]=true;
            if(i%prime[j]==0)break;
        }
    }
}
void disi_num(int v,int pos){//disintegrate_num分解质因数
    fcnt[pos]=0;
    int _sqrt=sqrt(v);
    for(int i=2;i<=_sqrt;i++){
        if(v%i==0)fac[pos][fcnt[pos]++]=i;
        while(v%i==0)v/=i;
    }
    if(v>1)fac[pos][fcnt[pos]++]=v;
}
void count_num(){
    for(int i=2;i<=100000;i++){
        for(int j=i+i;j<=100000;j+=i){
            num[i]+=num[j];
        }
    }
}
ll in_ex(int pos){
    ll res=0;
    for(int i=1;i<(1<<fcnt[pos]);i++){
        int cnt=0,mut=1;
        for(int j=0;j<fcnt[pos];j++){
            if(i&(1<<j)){
                cnt++;
                mut*=fac[pos][j];
            }
        }
        if(cnt&1)res+=(ll)num[mut]-1;//减去a[pos]本身,因为他就是这都是它的质因数
        else res-=(ll)num[mut]-1;
    }
    return res;
}

signed main()
{
    prime_sieve();
    scanf("%d",&T);
    while(T--){
        memset(num,0,sizeof(num));
        scanf("%d",&n);
        per(i,1,n){
            scanf("%d",&a[i]);
            num[a[i]]++;
            disi_num(a[i],i);
            //printf("i==%d ",i);//
            //per(j,0,fcnt[i]-1)printf("%d ",fac[i][j]);
            //printf("\n");//
        }
        count_num();
        ll res=0;
        for(int i=1;i<=n;i++){
            ll tmp=in_ex(i);
            res+=(ll)(n-1-tmp)*tmp;
        }
        res=(ll)n*(n-1)*(n-2)/6-res/2;
        printf("%lld\n",res);
    }

    return 0;
}

原文地址:https://www.cnblogs.com/WindFreedom/p/9697075.html

时间: 2024-08-29 23:49:01

hdu4135(容斥,同色三角形模型)的相关文章

hdu5072(鞍山regional problem C):容斥,同色三角形模型

现场过的第四多的题..当时没什么想法,回来学了下容斥,又听学长讲了一讲,终于把它过了 题目大意:给定n个数,求全部互质或者全部不互质的三元组的个数 先说一下同色三角形模型 n个点 每两个点连一条边(可以为红色或者黑色),求形成的三条边颜色相同的三角形的个数 反面考虑这个问题,只需要c(n,3)减去不同色的三角形个数即可 对于每一个点,所形成的不同色三角形即为 红色边的数量*黑色边的数量,所以可以O(n)地算出不同色三角形的个数(注意总数要除以2) 然后用c(n,3)减一下即可 对于这个题,如果把

hdu4135 容斥定理

Co-prime Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3587    Accepted Submission(s): 1419 Problem Description Given a number N, you are asked to count the number of integers between A and B

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

bzoj 1914: [Usaco2010 OPen]Triangle Counting 数三角形 容斥

1914: [Usaco2010 OPen]Triangle Counting 数三角形 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 272  Solved: 143[Submit][Status] Description 在 一只大灰狼偷偷潜入Farmer Don的牛群被群牛发现后,贝西现在不得不履行着她站岗的职责.从她的守卫塔向下瞭望简直就是一件烦透了的事情.她决定做一些开发智力的小练习,防止她睡 着了.想象牧场是一个X,Y平面的网格.她将N

Coprime (单色三角形+莫比乌斯反演(数论容斥))

这道题,先说一下单色三角形吧,推荐一篇noip的论文<国家集训队2003论文集许智磊> 链接:https://wenku.baidu.com/view/e87725c52cc58bd63186bd1b.html?from=search 单色三角形指的是n个顶点,有n(n-1)条边,很明显是每个点两两相连,那么这样所形成的所有三角形的边假如有两种颜色:红和黑.那么问一共有多少三角形的三边是一种颜色的个数. ,建议看一下那个论文,因为我只能直接给出你结论.  下面的数学符号:{...}为概率论中表

hdu4135 Co-prime(容斥)

题目链接:点这里!!!! 题意: 给你一个区间[A,B](1<=A<=B<=1E15),一个x(x<=1e9).问你[A,B]区间内有多少个数与x互质. 题解: 1.我们先把x的所有质因子找出来,注意x的最多存在1个质因子大于(sqrt(x)),所以我们可以先预处理出[1,sqrt(1e9)]所有的质数. 2.然后我们把x质因子分解并往下除,最后剩下的要么是1,要么就是大于sqrt(x)的质因子. 3.我们得到的质因子最多15个左右,我们直接利用容斥搞就可以了.我们得出的是与x不互

HDU 5072 Coprime 同色三角形问题

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

hdu5072 Coprime 2014鞍山现场赛C题 计数+容斥

http://acm.hdu.edu.cn/showproblem.php?pid=5072 Coprime Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Total Submission(s): 354    Accepted Submission(s): 154 Problem Description There are n people standing in a