单色三角形(hdu-5072

摘要:
单色三角形模型:空间中有n个点,任何三个点都不共线。如果三角形的三条边是相同的颜色,则该三角形被指控为单色三角形。对于给定的红色线段列表,查找单色三角形的数量。分析:对于一个顶点,如果有x个点与红线相连,那么有x个与黑线相连,并且有x*个三角形可以形成。因为每个点都会被遍历,所以结果会被重复,答案应该被2除。Hdu-5072给你n个数字,并问有多少对a.b.c.使两对互素或互不互素。

  单色三角形模型:空间里有n个点,任意三点不共线。每两个点之间都用红色或者黑色线段链接。如果一个三角形的三条边同色,责成这个三角形是单色三角形。对于给定的红色线段列表,找出单色三角形的个数。

  分析:对于一个顶点,设他连红线的点又x个,那么它脸黑线的点有(n-1-x)个,那么能组成的三角形有x*(n-1-x)个,因为每个点都会遍历,所以得到的结果会重复算,答案应除2。最终结果是C(n, 3) - sum/2。

  

  hdu-5072

  题意,给你n个数,问你有多少对a. b. c 使两两互质,或者两两不互质。

  分析:由上我们可以将互质不互质看成红蓝线,那么处理方式就是一样的了。其实就是组合数学和容斥。

ll pri[maxn],pri_num;
ll mu[maxn];//莫比乌斯函数值
bool vis[maxn];

void mobius()  {//筛法求莫比乌斯函数
    pri_num = 0;//素数个数
    memset(vis, false, sizeof(vis));
    vis[1] = true;
    mu[1] = 1;
    for(int i = 2; i <maxn; i++){
        if(!vis[i]){
            pri[pri_num++] = i;
            mu[i] = -1;
        }
        for(int j=0; j<pri_num && i*pri[j]<maxn ; j++){
            vis[i*pri[j]]=true;//标记非素数
            if(i%pri[j])mu[i*pri[j]] = -mu[i];
            else {
                mu[i*pri[j]] = 0;
                break;
            }

        }
    }
}
int a[maxn];
ll num[maxn], have[maxn];

void solve() {
    ll n;  scanf("%lld", &n);
    memset(vis, 0, sizeof(vis));
    memset(a, 0, sizeof(a));
    memset(have, 0, sizeof(have));
    memset(num, 0, sizeof(num));
    int maxx=0;
    for (int i=0; i<n; i++) {
        scanf("%d", &a[i]);
        vis[a[i]]++;
        maxx=max(maxx, a[i]);
    }
    for (int i=1; i<=maxx; i++) {
        for (int j=i; j<=maxx; j+=i)
            num[i] += vis[j];
        for (int j=i; j<=maxx; j+=i) {
            have[j] += mu[i]*num[i];
        }
    }
    ll ans=0;
    for (int i=0; i<n; i++) {
        if (a[i]!=1) {
            ans += have[a[i]]*(n-1-have[a[i]]);
        }
    }
    ans = n*(n-1)*(n-2)/6 - ans/2;
    printf("%lld
", ans);
}
int main() {
    int t=1;
   // freopen("in.txt", "r", stdin);
    scanf("%d", &t);
    mobius();
    for (int T=1; T<=t; T++) {
       // printf("Case %d: ", T);
        solve();
    }
    return 0;
}

免责声明:文章转载自《单色三角形(hdu-5072》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇SQLite学习笔记045.PGSQL-启动数据库报错Job for postgresql-13.service failed because the control process exited with error code. See "systemctl status postgresql-13.service" and "journalctl -xe" for details.下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

最小有向生成树

先看一下lrj的大白书上的讲解 emm。。。我是看完之后直接看的模板题代码。。。居然看懂。。。行吧。。 就是先判断 能不能联通  如能联通 就求出每个点的最小前驱边  求完之后 看有没有环 如有环 缩点更新 然后一直重复 直至无环且联通。。   //邻接矩阵模板: #include <iostream> #include <cstdio...

USACO 1.3 Wormholes

Wormholes Farmer John's hobby of conducting high-energy physics experiments on weekends has backfired, causing N wormholes (2 <= N <= 12, N even) to materialize on his farm,...

LCA问题【RMQ+Tarjan】

LCA-求树上两点最近公共祖先问题 lrj的紫书上提供了一种将LCA问题转化为RMQ问题的方法,即dfs一次处理出一个序列,first(u)代表u第一次出现的下标,则对于u,v的最近公共祖先的下标即为RMQ(first(u), first(v))。 LCA->RMQ(在线处理): 1 #include<bits/stdc++.h> 2...

【学习笔记】ac自动机&amp;amp;fail树

定义 解决文本串和多个模式串匹配的问题; 本质是由多个模式串形成的一个字典树,由tie的意义知道:trie上的每一个节点都是一个模式串的前缀; 在trie上加入fail边,一个节点fail边指向这个节点所代表的前缀的最长后缀节点(除开自身的后缀); 也就是说如果x->y,那么y所代表的串是x所代表的串在trie上出现过的最大后缀; 例子...