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

这道题,先说一下单色三角形吧,推荐一篇noip的论文《国家集训队2003论文集许智磊》

链接:https://wenku.baidu.com/view/e87725c52cc58bd63186bd1b.html?from=search

单色三角形指的是n个顶点,有n(n-1)条边,很明显是每个点两两相连,那么这样所形成的所有三角形的边假如有两种颜色:红和黑。那么问一共有多少三角形的三边是一种颜色的个数。

,建议看一下那个论文,因为我只能直接给出你结论。  下面的数学符号:{...}为概率论中表示事件的符号(集合),|{...}| 表示集合的元素个数。

如图,可知  |{ 单色三角形事件 } |  =|{ 所有三角形 }| - |{ 非单色三角形  }|   很容易得 | { 所有三角形 } | = C3n=n(n-1)(n-2)/6;  那么就直接把| { 非单色三角形 } |求出来。

如图:非单色三角形有的情况和的情况, 但是无疑都存在两个顶点所连接的两个边都是异色。那么,我们就将这个图抽象成n个这样类似的图那么,如果知道顶点 i 的红色边 ai 的话, 那么 黑色边就是 n-1-ai, 那么,| { 包含 i 顶点的非单色三角形 } |=ai(n-1-ai);  那么,由加法原理得   | { 非单色三角形 } | = ∑ai(n-1-ai);

这样就可以计算出,所有单色三角形的个数了。



那么,我们先看看这个题的特性(ai, aj, ak){i<j<k}  S={ 满足两两互质,或者两两不互质 }。是不是相当于边的颜色为红色和为黑色呢?那么,ai  就相当于顶点

假如,我们已经知道了ai 与那些所给的数据 不互质的个数 bi 。(我们先说不互质的情况。至于为什么,一会下面理解了莫比乌兹反演就知道了。)

那么,|S|=|{ 所有(ai,aj, ak)的任意组合 }| - |{ !S }|    (!S表示S的反 )

还是,把重点放在| {!S} |  上,刚刚,我们是假设已知那些数据与ai不互质的个数bi, 但是怎么得到bi就涉及到另一个重大的问题。



莫比乌斯反演——容斥原理。

其实,这道题加深了我个人对莫比乌斯的理解吧。

都知道一般容斥原理的公式,|S1+S2+S3+S4+S5.....+Sk|=∑(-1)(n-1)∏(Sx...Sy)  (不知道的自己百度)

这个公式,用文氏图非常明显,是任何时间(集合)的子集之间的相互关系的一种,当然也是定义讲的好。

那么,数论呢?其实,它也有像一般容斥的公式,它就是莫比乌斯反演。只不过,它的集合就是以所有数为元素的集合,处理的对象很多是(x, y)这样的数对。



回到题上:当转化为gcd(ai,aj)=k, 那么,我们可以在数据ai中找出最大值max,得到一个k的范围 [ 1, max], 先记录枚举当数据ai中质数因子为k的个数,记录为 mk。这样就得到了[ 1, max ]为质因子的数的个数{m}。

这时,把 gcd(x, y)!=1 这个拿出来,由x, y的唯一质数分解得,∑|{gcd(x, 1)=1}|-∑| {gcd(x,y)=k} | +∑|{gcd(x, y)=n*m}|-∑|{gcd(x, y)=nmh}|....=∑u(d)F(n/d);  (感觉这里写的有些毛病。)

ac代码:

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
#define ll long long
const int maxn = 1e5 + 10;
int a[maxn];
int vis[maxn];
int mu[maxn];
int prime[maxn];

void mobius()
{
    mu[1] = 1;
    int cnt = 0;
    for (int i = 2; i < maxn; ++i)
    {
        if (!vis[i]){    prime[cnt++] = i;    mu[i] = -1;}
        for (int j = 0; j < cnt&&prime[j] * i < maxn; ++j)
        {
            vis[prime[j] * i] = 1;
            if (i%prime[j] == 0){ mu[prime[j] * i] = 0; break; }
            mu[prime[j] * i] = -mu[i];
        }
    }
}
int maxx;
ll n, hz[maxn], num[maxn];

void solve()
{
    memset(hz, 0, sizeof(hz));
    memset(num, 0, sizeof(num));
    for (int i = 1; i <= maxx; ++i)
    {
        for (int j = i; j <= maxx; j += i)        //寻找i的倍数的个数
            num[i] += vis[j];
        for (int j = i; j <= maxx; j += i)
            hz[j] += mu[i] * num[i];
    }
    ll ans = 0;
    for (int i = 0; i < n; ++i)
    {
        if (a[i] != 1)
        {
            ans += 1LL*(hz[a[i]]*(n - 1 - hz[a[i]]));
        }
    }
    ans = n*(n - 1) * 1LL * (n - 2) / 6 - ans / 2;
    printf("%lld\n", ans);
}

int main()
{
    int t;
    scanf("%d", &t);
    mobius();
    while (t--)
    {
        memset(vis, 0, sizeof(vis));
        memset(a, 0, sizeof(a));
        scanf("%lld", &n);
        maxx = 0;
        for (int i = 0; i < n; ++i)
        {
            scanf("%lld", &a[i]);
            ++vis[a[i]];
            maxx = max(maxx, a[i]);
        }
        solve();
    }
}

原文地址:https://www.cnblogs.com/ALINGMAOMAO/p/9688647.html

时间: 2024-10-23 00:48:01

Coprime (单色三角形+莫比乌斯反演(数论容斥))的相关文章

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

JZYZOJ1518 [haoi2011]b 莫比乌斯反演 分块 容斥

http://172.20.6.3/Problem_Show.asp?id=1518最开始只想到了n^2的写法,肯定要超时的,所以要对求gcd的过程进行优化.首先是前缀和容斥,很好理解.第二个优化大致如下:u为莫比乌斯函数,t为gcd(x,y)为i的倍数的数的个数:满足gcd(x,y)=1的数字对的数量=sigma(1<=i<=min(x,y))u[i]*t[i];t[i]=(x/i)*(y-i);由小数向下取整可知有连续的i满足x/i为定值,y/i也是定值,所以可以分块计算,用u[i]的前缀

POJ 1150 The Last Non-zero Digit 数论+容斥

POJ 1150 The Last Non-zero Digit 数论+容斥 题目地址: POJ 1150 题意: 求排列P(n, m)后面第一个非0的数. 分析: 为了熟悉题目中的理论,我先做了俩初级的题目: POJ 1401,题解见:POJ 1401 && ZOJ 2202 Factorial 阶乘N!的末尾零的个数 NYOJ 954,题解见:NYOJ 954 求N!二进制末尾几个0 这题想了一下,十进制末尾几个0可以转化为几个5因子,二进制最后一位非0可以转化为2因子,但是10进制就

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 4059 The Boss on Mars

The Boss on Mars Problem's Link Mean: 给定一个整数n,求1~n中所有与n互质的数的四次方的和.(1<=n<=1e8) analyse: 看似简单,倘若自己手动推公式的话,还是需要一定的数学基础. 总的思路:先求出sum1=(1^4)+(2^4)+...(n^4),再求出sum2=(1~n中与n不互质的数的四次方的和),answer=sum1-sum2. 如何求sum1呢? 有两种方法: 1.数列差分.由于A={Sn}={a1^4+a2^4+...an^4}

hdu1695:数论+容斥

题目大意: 求x属于[1,b]和 y属于[1,d]的 gcd(x,y)=k 的方案数 题解: 观察发现 gcd()=k 不好处理,想到将x=x/k,y=y/k 后 gcd(x,y)=1.. 即问题转化为求区间 [1,b/k]和 [1,d/k]的互质数对个数 由于题目规定 (x,y)和(y,x)是同一种,所以我们可以规定 x<y,,然后只需对每一个y求出比他小的即可 公共部分可以通过欧拉函数快速求出.. 非公共部分就不行了.. 所以就分解质因数,用容斥的方法求了 #include <iostre

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

我们先来介绍一下单色三角形问题,如下 单色三角形 在空间中给出了n个点.这些点任三点不共线,并且每两个点之间都有一条线相连,每一条线不是红的就是黑的.在这些点和线组成的三角形中,如果一个三角形的三条边的颜色都相同,那么我们就称这个三角形为单色三角形.现给出所有涂红色的线,试求出单色三角形的数目. 任务: 请写一个程序: 从文本文件中读入点数和对红色连线的描述: 找出该图中红色三角形的数目: 把结果输出到文件TRO.OUT中. 输入格式: 在文本文件TRO.IN的第一行包括一个整数n,3 <= n

【bzoj2393】Cirno的完美算数教室 数论容斥

Description ~Cirno发现了一种baka数,这种数呢~只含有2和⑨两种数字~~ 现在Cirno想知道~一个区间中~~有多少个数能被baka数整除~ 但是Cirno这么天才的妖精才不屑去数啦 只能依靠聪明的你咯. Input 一行正整数L R ( 1 < L < R < 10^10) Output 一个正整数,代表所求的答案 Sample Input 1 100 Sample Output 58 HINT 此题数据范围应该是10^9 题解: 处理处所有数然后容斥. 1 #in

BZOJ 4036: [HAOI2015]按位或 集合幂函数 莫比乌斯变换 莫比乌斯反演

http://www.lydsy.com/JudgeOnline/problem.php?id=4036 http://blog.csdn.net/lych_cys/article/details/50898726 http://blog.csdn.net/qq_21995319/article/details/49800999 for(int i=1;i<=1;i++) for(int j=1;j<=1;j++) f[i○j]=a[i]*b[j]; 当○为按位或时,这种运算就称为集合并卷积.