数学知识:容斥原理

简介: 复习acwing算法基础课的内容,本篇为讲解数学知识:容斥原理,关于时间复杂度:目前博主不太会计算,先鸽了,日后一定补上。

文章目录

前言

一、容斥原理

二、AcWing 890. 能被整除的数

本题解析

AC代码

三、时间复杂度



前言

复习acwing算法基础课的内容,本篇为讲解数学知识:容斥原理,关于时间复杂度:目前博主不太会计算,先鸽了,日后一定补上。


一、容斥原理

其实类似于我们高中所接触过的韦恩图计算的方法,这里给出公式,具体的原因推导证明请面向百度:



二、AcWing 890. 能被整除的数

本题链接:AcWing 890. 能被整除的数

本博客提供本题截图:

image.png

本题解析

数组p存储的就是质数,记Si为在1~n中能整除p[i]的集合,我们根据容斥原理的公式,我们不需要知道每一个集合中的元素是什么,我们只需要知道每一个集合中的元素个数即可,故Si = n / p[i],确定交集的数量,因为p[i]均为质数,这些质数的乘积就是他们的最小公倍数,n除这个最小公倍数就是交集的大小,那么如何知道一个集合的状态呢?即是否选取了这个集合:我们可以用二进制去表示,例如m = 5,那么对于01101就表示选择了S1,S3,S4,其余的解析详细见AC代码板块


AC代码

#include <iostream>
#include <algorithm>
using namespace std;
typedef long long LL;
const int N = 20;
int p[N];
int main()
{
    int n, m;
    cin >> n >> m;
    for (int i = 0; i < m; i ++ ) cin >> p[i];
    int res = 0;
    for (int i = 1; i < 1 << m; i ++ )   //每个集合都有选择或不选择的情况,所以总情况个数就是  1 << m - 1
    {
        int t = 1, s = 0;       //s代表有选择了多少个集合
        //t表示选中集合对应质数的乘积
        for (int j = 0; j < m; j ++ )  //遍历m个集合的选择情况
            if (i >> j & 1)  //如果有选择这个集合
            {
                if ((LL)t * p[j] > n)   //选择集合对应质数乘积超过了n
                { 
                    t = -1;
                    break;
                }
                t *= p[j];              //计算乘积
                s ++ ;                  //选择的集合数 + 1
            }
        if (t != -1)
        {
            if (s % 2) res += n / t;    //如果是奇数的话就加
            else res -= n / t;          //如果是偶数的话就减
        }
    }
    cout << res << endl;
    return 0;
}

三、时间复杂度

关于容斥原理各步操作的时间复杂度以及证明,后续会给出详细的说明以及证明过程,目前先鸽了。



目录
相关文章
|
6月前
数论——高斯消元
数论——高斯消元
34 0
|
9月前
|
人工智能 算法
算法提高:组合数学| 容斥原理常见应用
容斥原理常见的问题如下。 (1) 篮球、羽毛球、网球三种运动,至少会一种的有22人,会篮球的有15人,会羽毛球的有17人,会网球的有12人,既会篮球又会羽毛球的有11人,既会羽毛球又会网球的有7人,既会篮球又会网球的有9人,那么三种运动都会的有多少人? (2) 《西游记》《三国演义》《红楼梦》三大名著,至少读过其中一本的有20人,读过《西游记》的有10人,读过《三国演义》的有12人,读过《红楼梦》的有15人,读过《西游记》《三国演义》的有8人,读过《三国演义》《红楼梦》的有9人,读过《西游记》《红楼梦》的有7人。问三本书全都读过的有多少人?
101 0
算法提高:组合数学| 容斥原理常见应用
|
9月前
|
机器学习/深度学习 算法
算法提高:组合数学| 卡特兰数的实现
卡特兰数列是组合数学中在各种计数问题中常出现的数列,其前几项为1,1,2,5,14,42,132,429,1430,4862,16796,58786,208012…… 卡特兰数首先是由欧拉在计算对凸n边形的不同的对角三角形剖分的个数问题时得到的,即在一个凸n边形中,通过不相交于n边形内部的对角线,把n边形拆分成若干三角形,不同的拆分数用Hn表示,Hn即卡特兰数。
83 0
算法提高:组合数学| 卡特兰数的实现
|
12月前
|
存储
数学知识-约数
数学知识-约数
|
算法
数学知识:中国剩余定理
复习acwing算法基础课的内容,本篇为讲解数学知识:中国剩余定理,关于时间复杂度:目前博主不太会计算,先鸽了,日后一定补上。
119 0
数学知识:中国剩余定理
|
存储 算法
数学知识:高斯消元(一)
复习acwing算法基础课的内容,本篇为讲解数学知识:高斯消元,关于时间复杂度:目前博主不太会计算,先鸽了,日后一定补上。
115 0
数学知识:高斯消元(一)
数学知识:高斯消元(二)
AcWing 884. 高斯消元解异或线性方程组
82 0
数学知识:高斯消元(二)
|
算法
数学知识:求组合数(二)
复习acwing算法基础课的内容,本篇为讲解数学知识:求组合数,关于时间复杂度:目前博主不太会计算,先鸽了,日后一定补上。
106 0
数学知识:求组合数(二)
|
算法
数学知识:求组合数(三)
复习acwing算法基础课的内容,本篇为讲解数学知识:求组合数,关于时间复杂度:目前博主不太会计算,先鸽了,日后一定补上。
89 0
数学知识:求组合数(三)
|
算法
数学知识:求组合数(一)
复习acwing算法基础课的内容,本篇为讲解数学知识:求组合数,关于时间复杂度:目前博主不太会计算,先鸽了,日后一定补上。
108 0
数学知识:求组合数(一)