算法中的数学知识(三)—容斥原理与简单博弈论(SG定理)

【博弈论】SG函数/SG定理(组合游戏) 文章目录一.前置知识1.异或(xor)2.必胜态/必败态二.Nim游戏1.游戏内容2.结论(Bouton定理)3.证明三.SG函数1.作用2.mex运算3.SG函数计算4.实例(取石子游戏)5.Sprague-Grundy定理 一.前置知识 1.异或(xor) 定义: 用符号⊕表示异或运算 两个一位二进制数运算时: a⊕b=(¬a∧b)∨(a∧¬b)a⊕b= (¬a ∧ b) ∨ (a ∧¬b)a⊕b=(¬a∧b)∨(a∧¬b) 1⊕0=11⊕0=11⊕0=1 ; 0⊕1=10⊕1=10⊕1=1; 1⊕ 阅读详情

- 本人的LeetCode账号:魔术师的徒弟,欢迎关注获取每日一题题解,快来一起刷题呀~

一、容斥原理

1 容斥原理介绍

  高中中,我们学过一个经典的容斥原理的图:

  这便是最简单的容斥原理。

  这个公式可以推广到一般的n个圆的交集。
S = S ( 1 ) + S ( 2 ) + . . . + S ( n ) − ∑ i , j , i ! = j s ( i ) s ( j ) + ∑ i , j , k s ( i ) s ( j ) s ( k ) . . . + ( − 1 ) n − 1 s ( 1 ) s ( 2 ) ∗ . . . ∗ s ( n ) S = S(1)+S(2) +...+S(n)\\ -\sum_{i,j, i!=j}s(i)s(j)\\ +\sum_{i,j,k}s(i)s(j)s(k)\\ ... +(-1)^{n - 1}s(1)s(2)*...*s(n) S=S(1)+S(2)+...+S(n)−i,j,i!=j∑​s(i)s(j)+i,j,k∑​s(i)s(j)s(k)...+(−1)n−1s(1)s(2)∗...∗s(n)
  它总共有:
C n 1 + C n 2 + . . . + C n n + C n 0 − C n 0 = 2 n − 1 等 价 于 从 n 个 数 中 选 任 意 多 个 数 的 组 合 个 数 每 个 数 选 与 不 选 C_n^1+C_n^2+...+C_n^n+C_n^0-C_n^0 = 2^n - 1\\ 等价于从n个数中选任意多个数的组合个数 每个数选与不选 Cn1​+Cn2​+...+Cnn​+Cn0​−Cn0​=2n−1等价于从n个数中选任意多个数的组合个数每个数选与不选
  所以它的时间复杂度是O(2^n)级别。

2 例题—能被整除的数

  如果对每个数都把所有质数能否被其整除来判断一次,时间复杂度是O(NM),绝对会超时。

  利用容器原理:以测试用例为例:

  容斥原理的时间复杂度是2^m,2^16,完全ok。
S p 怎 么 求 呢 ? n / p 下 取 整 即 可 。 S i ∩ S j 怎 么 求 呢 ? 因 为 i 和 j 都 是 质 数 , 所 以 就 是 能 被 i ∗ j 整 除 的 数 的 个 数 n / ( i ∗ j ) S_p怎么求呢?n/p下取整即可。\\ S_i∩S_j怎么求呢?因为i和j都是质数,所以就是能被i * j整除的数的个数\\ n / (i * j) Sp​怎么求呢?n/p下取整即可。Si​∩Sj​怎么求呢?因为i和j都是质数,所以就是能被i∗j整除的数的个数n/(i∗j)

  所以算每个集合的大小的时间复杂度是O(k)的(k是素数个数)。

  所以总时间复杂度是O(2^16 * 2^4) = o(2^20) = 1000000。

  那么我们如何把容斥原理实现出来呢?一方面,当然我们可以用DFS来完成,但是对于这种枚举所有集合的问题,我们常常用位运算来实现。

  所以用16个二进制位就可以了,所以我们只要从1枚举到2^m就行了。

#include <iostream>
#include <vector>
using namespace std;
typedef long long LL;

int n, m;

int main()
{
    cin >> n >> m;
    vector<int> p(m);
    for (int i = 0; i < m; ++i) cin >> p[i];
    int res = 0;
    // 枚举所有的集合 通过16位表示状态
    for (int i = 1; i < (1 << m); ++i)
    {
        int cnt = 0, t = 1;
        for (int j = 0; j < m; ++j)
        {
            if (i >> j & 1) 
            {
                ++cnt;
                // 如果t * p[j]大于n了,1~n中不可能有整除t的数 break掉就行
                if ((LL)t * p[j] > n)
                {
                    t = -1;
                    break;
                }
                // 把这个质数乘上
                t *= p[j];
            }
        }
        if (t != -1)
        {
            // 1~n中被t整除的数的个数 n / t
            if (cnt % 2) res += n / t;
            else res -= n / t;
        }
    }
    cout << res << endl;
    return 0;
}

二、简单博弈论

1 常见概念

  公平组合游戏ICG:

  若一个游戏满足:

  • 由两名玩家交替行动
  • 在游戏进程的任意时刻,可以执行的合法行动与轮到哪名玩家无关
  • 不能行动的玩家判负

  则称该游戏为一个公平组合游戏,Nim博弈属于公平组合游戏,但城建类的棋盘类游戏,比如围棋,就是不公平组合游戏。因为围棋交战双方只能落黑子或白子,胜负判定也比较复杂。

  有向图游戏:

  给定一个有向无环图,图中有一个唯一的起点,在起点放一枚棋子,两名玩家交替的把这枚棋子沿着有向边进行移动,每次可以移动一步,无法移动者判负,这类游戏被称为有向图游戏。

  可以证明,任何一个公平组合游戏都可以转化为有向图游戏。具体方法是:把每个局面看成图中的一个结点,并且从一个局面经过一个合法的操作到达下一个局面,则这两个局面之间就有一个有向边。

2 Nim游戏

  以2 3为例,先手可以先从3中拿一个石子,然后构成2 2这种石子个数相等的情况,然后不管它怎么拿,我镜像的从另一个堆里头拿,就可以实时维护两堆的数量相等,这样一定是后手放先一道石头被拿完的情况。

  必胜态(先手):先手拿完之后可以让剩下的状态变成一个必败状态,则先手就是必胜状态。

  必败态(先手):不管怎么操作,最终到达的所有状态都是必败的,就是必败态。

  定理:设n堆石子的个数是a1,a2,...,an,若a1 ^ a2 ^...^an = 0,则先手必败,否则先手必胜。

事实1.当走到终点时,异或值是0;

定理1.a_1 ^ a_2 ^ ... ^a_n = x != 0时,我们一定可以从某一堆中拿出若干石子,让剩下的值异或起来变成0。

定理1Proof:

  设在x的二进制表示中,最高的一位1在第k位,根据异或的性质,这说明a_1 - a_n中必然有一个数,其第k为为1(否则第k位必然为0);

  不妨设a_i的第k为是1;

  那么有a_i ^ x < a_i(a_i前面不变,第k位变0了,所以是严格小);

  所以我们可以从a_i中拿走a_i - (a_i ^ x)个石子(这个数一定大于0);

  它就剩了a_i ^ x个石子,这时剩下的所有数异或起来就是0,定理1就得证了.

定理2.a_1 ^ a_2 ^ ... ^a_n = x == 0时,不管接下来怎么去拿,剩下所有值异或起来一定不是0。

定理2Proof:

  利用反证法:假设拿了以后,剩下的所有数的异或值是0,则有a_1 ^ a_2 ^ ... ^ a_{i'} ^ ... ^ a_n = x ==0;

  将它与题目中所给的条件式子异或一下,有:a_i ^ a_{i'} == 0,这说明a_i = a_{i'},但我们不可能拿0个石子,矛盾了。

  所以如果a1^a2^...^an != 0,根据定理1,则先手一定可以转移到状态a1 ^ a2 ^ ... ^ an == 0,根据定理2,后手的操作必然会把总异或值弄的不是0,然后先手又一定可以把异或值再变成0,根据事实1,必败态是0 ^ 0 ^ 0 ^...^ 0 == 0,所以最终一定是后手者面对这个必败态,所以此时先手必胜。

  显然反之,后手必胜。

#include <iostream>
using namespace std;

const int N = 1e5 + 10;
int a[N];
int n;

int main()
{
    cin >> n;
    int x = 0;
    for (int i = 0; i < n; ++i)
    {
        scanf("%d", &a[i]);
        x ^= a[i];
    }
    if (x) puts("Yes");
    else puts("No");
}

3 有向无环图游戏的判断方法—SG函数

  假定自然数组成的集合A的mex运算是,找到一个自然数x,它是不在集合A中最小的所有自然数中最小的一个数。

  在一个有向无环图游戏中,定义终点状态的SG函数值是0,即SG(终点) = 0。

  那么对任意一个状态x,其SG(x)怎么求呢?

  假设x可以转移到k个状态:y1、y2、y3、y4...yk,那么定义
S G ( x ) = m e x ( S G ( y 1 ) , S G ( y 2 ) , . . . , S G ( y k ) ) SG(x)=mex(SG(y_1), SG(y_2), ..., SG(y_k)) SG(x)=mex(SG(y1​),SG(y2​),...,SG(yk​))
  一个求SG函数的值的测试:

  如何通过SG(x)来判断其是否为必胜态或必败态?

  显然有:任何一种SG(x) != 0的状态,它一定可以通过某条边到SG(yi) = 0的状态;任何一种SG(x) == 0的状态,它一定不可以转移到SG(yi) == 0的状态。

  所以如果我们先手是SG(x) != 0的状态,我们一定可以通过一个方法让下一个状态面对SG(i) = 0,然后后手通过任何操作,下一状态都一定是SG(x) != 0,而必败态是SG(i) = 0的终点,所以此时先手必胜,反之先手必败。

  一般比较复杂的题目中,玩家会同时面对多个有向无环图游戏,每次可以选择任意一个图去走一步,此时怎么办呢?

  假设我们有n个图,每个图起点的SG函数值为:SG(xi),若SG(x1) ^ SG(x2) ^ ... ^ SG(xn) == 0,则先手必败,否则先手必胜,它的证明和Nim游戏是一样的。

Proof:

定理1:必败态对应SG(x1) ^ SG(x2) ^ ... ^ SG(xn) == 0。

  必败态对应每个有向无环图游戏都必败,即SG(Xi) == 0,i = 1, 2, 3, ..., n,显然此时SG(x1) ^ SG(x2) ^ ... ^ SG(xn) == 0。

定理2:若SG(x1) ^ SG(x2) ^ ... ^ SG(xn) != 0,则可以一定可以通过在某个图上转移一步,使其转移到SG(x1) ^ SG(x2) ^ ... ^ SG(xn) == 0。

  设x = SG(x1) ^ SG(x2) ^ ... ^ SG(xn) ,那么因为x不为0,假设其二进制位表示中最高的一位1的位数是k,因为SG(x1) ^ SG(x2) ^ ... ^ SG(xn) != 0,所以必然有一个SG(xi),其第k位不为0。

  那么必然有SG(xi) ^ x < SG(xi).

  根据SG函数的定义,所以SG(xi)一定可以通过一步操作转移到SG(xi) ^ x,此时全体异或值就等于x ^ x = 0,这样就完成了转移。

定理3:若SG(x1) ^ SG(x2) ^ ... ^ SG(xn) == 0,则任何操作都会转移到一个SG(x1) ^ SG(x2) ^ ... ^ SG(xn) != 0的状态。

  反证法:假设我们修改了SG(xi)使其变为SG(xi'),并且满足SG(x1) ^ SG(x2) ^ ...^ SG(xi') ^ ... ^ SG(xn) == 0,那么将它与条件式相异或,有:SG(xi) ^ SG(xi') == 0,因此SG(xi) == SG(xi'),而根据SG函数的定义,每次转移我们不可以转移到和自己SG函数值相等的状态,不然自己这个状态的SG值一定不等于当前值,所以矛盾,所以原命题得证。

  因此如果先手时,若SG(x1) ^ SG(x2) ^ ... ^ SG(xn) != 0,那么先手一定可以通过一种方法转移到SG(x1) ^ SG(x2) ^ ... ^ SG(xn) == 0的状态,而后手不论是什么操作,它都将转移到SG(x1) ^ SG(x2) ^ ... ^ SG(xn) != 0的状态,所以我们可以一直控制先手的SG(x1) ^ SG(x2) ^ ... ^ SG(xn) != 0,后手的SG(x1) ^ SG(x2) ^ ... ^ SG(xn) == 0,而必败态对应SG(x1) ^ SG(x2) ^ ... ^ SG(xn) == 0,所以后手一定会失败,先手必胜。

  所以我们定义N个有向无环图游戏组成的游戏的SG值为:SG(x1, x2, ...,xn) = SG(x1) ^ SG(x2) ^ ... ^ SG(xn)。

4 SG函数例题—集合Nim函数

  仅考虑一堆石头,有:

  N堆石子我们可以看成有N个有向无环图,我们只要求出他们的SG值异或起来,根据SG定理判断一下是不是0就行了。

#include <iostream>
#include <unordered_set>
#include <cstring>
using namespace std;

const int N = 110;
int s[N];// 集合中的个数s 
const int M = 1e4 + 10;
int f[M];// 记忆化搜索求SG(x)时的状态
int k, n;

int SG(int x)
{
    if (f[x] != -1) return f[x];
    unordered_set<int> Y;// 可以转移到的所有状态
    // 枚举集合s 来转移
    for (int i = 0; i < k; ++i)
    {
        int sum = s[i];
        // 如果x > sum 说明它可以拿走num个转移到x - num状态
        if (x >= sum) Y.insert(SG(x - sum));
    }
    // 求SG值 即第一个不在Y中的自然数
    for (int i = 0; ; i++)
        if (Y.count(i) == 0) return f[x] = i;
}

int main()
{
    cin >> k;
    for (int i = 0; i < k; ++i) cin >> s[i];
    cin >> n;
    // 初始化都为-1 表示每个状态都未计算过
    memset(f, -1, sizeof(f));
    int res = 0;
    while (n--)
    {
        int x;
        cin >> x;
        res ^= SG(x);// 求每一堆对应的有向无环图游戏的起点的SG值
    }
    if (res) puts("Yes");
    else puts("No");
    return 0;
}

5 台阶Nim游戏

  对于n个台阶的思考结论是:

若x1 ^ x3 ^ x5 ^ .... = x != 0,则先手必胜,否则先手必败。

证明:

  假设x != 0,根据经典Nim游戏的结论,那么我们一定可以把一个奇数位置的石头拿一定数量起来,移动到偶数位,使得x1 ^ x3 ^ x5 ^ .... = x == 0;

  下一轮操作,如果对手是从偶数台阶拿的,那我我们就把它拿的数量再放到下一级偶数台阶,使得抛给对手的盘是一个x1 ^ x3 ^ x5 ^ .... = x == 0;

  如果对手是从奇数级台阶拿的,那么根据经典Nim游戏的结论,此时他抛给我们的局面一定是x1 ^ x3 ^ x5 ^ .... = x != 0,然后根据经典Nim游戏的结论,我们有一定可以抛给对面x1 ^ x3 ^ x5 ^ .... = x == 0.

  也就是说,不管怎么样,我们可以严格控制对手面对的是x1 ^ x3 ^ x5 ^ .... = x == 0,并且我们永远是有石子可以拿的,而必败态是x1 ^ x3 ^ x5 ^ .... = x == 0,所以终止局面一定会被对手遇到。

  反之,先手必败。

#include <iostream>
using namespace std;

int main()
{
    int res = 0;
    int n, x;
    cin >> n;
    int cnt = 1;
    while (n--)
    {
        cin >> x;
        if (cnt & 1) res ^= x;
        ++cnt;
    }
    if (res) puts("Yes");
    else puts("No");
    return 0;
}

6 拆分Nim游戏

  首先,这个游戏一定可以结束,因为我们每次操作后,最大值一定会不断减小,虽然堆的总数可能会变多,但是拿走后放回来的两个对的最大值数量会减少。

  我们把开始的每堆石子看做一个独立的局面,求得每个局面的SG值即可。

  本题比较特别,一次操作会使局面由a->(b1, b2),根据SG函数的性质,局面SG(b1, b2) = SG(b1) ^ SG(b2),所以这样就可以求出a状态转移到的每个SG值,然后异或起来就行了,所以我们可以用记忆化搜索来做这个题。

#include <iostream>
#include <cstring>
#include <unordered_set>
using namespace std;

const int N = 110;
int f[N];
int n;

int sg(int x)
{
    if (f[x] != -1) return f[x];
    unordered_set<int> S;
    for (int i = 0; i < x; ++i)
        for (int j = 0; j <= i; ++j)
            S.insert(sg(i) ^ sg(j));
    for (int i = 0; ; ++i)
        if (S.count(i) == 0) return f[x] = i;
}

int main()
{
    cin >> n;
    int res = 0;
    int x;
    memset(f, -1, sizeof(f));
    while (n--)
    {
        cin >> x;
        res ^= sg(x);
    }
    if (res) puts("Yes");
    else puts("No");
    return 0;
}
(组合游戏)SG函数与SG定理详解 文章目录前言什么是组合游戏必胜点和必败点的概念Sprague-Grundy(SG)定理SG函数 前言   好久没写博客了,上一篇博客还是去年实训写的,一是因为寒假,二是因为随着难度的加深,学一个算法的时间也变长了很多(蒟蒻专有buff)。当然,最重要的还是因为自己懒~   后面会继续努力的。(这csdn的markdown编辑器又改版了越来越难用了) 转载请注明转自bestsort的博客 ... 阅读详情

相关推荐

SG定理

初始问题 给定NN堆石子,每堆有AiA_{i}个石子。两个人轮流操作,每轮可以选一堆石子来取石子,可以取完,但不能不取。无法操作者输。问先手是否必胜。 SG定理 相信很多人都已经知道了这个定理。 假设现在有一个有向无环的游戏图G(V,E)G(V,E),若(i,j)∈E(i,j) \in E则表示状态ii可以转移到状态jj. 我们还要定义必胜态与必败态的概念。 必胜态表示,从当前状态可以

PhilipsWeng的专栏 4543

组合数学 —— 容斥定理

【概述】 容斥原理是一种较常用的计数方法,其基本思想是:先不考虑重叠的情况,把包含于某内容中的所有对象的数目先计算出来,然后再把计数时重复计算的数目排斥出去,使得计算的结果既无遗漏又无重复。 容斥原理核心的计数规则可以记为一句话:奇加偶减 假设被计数的有 A、B、C 三类,那么,A、B、C 类元素个数总和 = A 类元素个数 + B类元素个数 + C类元素个数 - 既是 A 又是 B 的元素...

Alex_McAvoy的博客 1万+

NOIP数学知识

算法竞赛进阶指南第四章知识点摘要与总结拓展

playedgames的博客 866

博弈论-SG函数和SG定理

1.SG函数和SG定理是一个十分神奇的东西,有了它,绝大部分的博弈都可以被统一到这个上面,都可以使用SG函数解决。是一种解决博弈问题的十分方便的手段。 2.首先给出一些基本的定义:mex运算,这个是作用在集合上的运算,具体的含义就是:找出不属于当前集合最小的非负整数,可能你有点晕,我们看几个例子。mex{1,2,3}=0;为什么?因为自然数从0开始,不属于这个集合最小的非负整数就是0了,再例如m...

YG爱木木 3568

ESP32小车DIY:从零搭建无线遥控智能车(附完整代码与避坑指南)

本文详细介绍了如何从零开始DIY一台基于ESP32的无线遥控智能小车。内容涵盖核心硬件选型、电路设计、低延迟ESP-NOW无线通信协议的配置与实战,以及双电机差速控制算法与PWM调速的实现。文章提供了完整的代码示例和关键的避坑指南,旨在帮助开发者快速构建稳定可靠的智能车平台,并为进一步的功能扩展奠定基础。

gamma的博客 471

远程桌面连接失败?手把手教你解决CredSSP加密Oracle漏洞(Win10/Win11通用)

本文详细解析了Windows远程桌面连接因CredSSP加密Oracle漏洞安全更新导致的“身份验证错误”问题。文章从原理入手,提供了通过组策略编辑器(适用于专业版)和注册表编辑器(适用于家庭版)两种核心解决方案,指导用户将安全策略调整为推荐的“缓解”模式,以在保障安全的前提下恢复连接,并给出了高级脚本处理与安全最佳实践。

u6v7w8x的博客 728

数学知识(三)——博弈论

给定N堆物品,第i堆物品有Ai个。两名玩家轮流行动,每次可以任选一堆,取走任意多个物品,可把一堆取光,但不能不取。取走最后一件物品者获胜。两人都采取最优策略,问先手是否必胜。我们把这种游戏称为NIM博弈。把游戏过程中面临的状态称为局面。整局游戏第一个行动的称为先手,第二个行动的称为后手。若在某一局面下无论采取何种行动,都会输掉游戏,则称该局面必败。所谓采取最优策略是指,若在某一局面下存在某种行动,使得行动后对面面临必败局面,则优先采取该行动。同时,这样的局面被称为必胜。

2301_79941476的博客 1088

COCO2017数据集类别分布深度解析

本文深入解析了COCO2017数据集的类别分布情况,包括80个常见物体的分类统计和样本数量分析。通过对比训练集与验证集的分布一致性,探讨了数据均衡性问题,并针对高频和低频类别提出了实用的数据预处理和模型训练建议,帮助优化计算机视觉任务的性能。

weixin_42533751的博客 370

第四章 数学知识(四)——容斥原理、博弈论

算法基础课: 第四章 数学知识(四)。 共5题,知识点如下。 容斥原理: AcWing 890. 能被整除的数。 博弈论: AcWing 891. Nim游戏、 AcWing 892. 台阶-Nim游戏、 AcWing 893. 集合-Nim游戏、 AcWing 894. 拆分-Nim游戏。

qq_44005993的博客 293

Python_构建同花顺问财智能选股API服务

本文详细介绍了如何使用Python构建同花顺问财智能选股API服务,涵盖从环境准备、核心API开发到高级功能扩展的全过程。通过Flask框架和pywencai库,开发者可以快速搭建稳定可靠的选股接口,实现自动化股票筛选与交易系统集成,提升量化投资效率。

weixin_30596343的博客 333

【Benchmark 性能测试全指南:从核心原理到 CINEBENCH 实战解析】

本文深度拆解基准测试(Benchmark)的底层逻辑,详解数据集、工作负载、度量指标三大核心要素,分步演示测试流程与统计分析要点。结合 CINEBENCH R23 实战案例,揭秘 CPU 性能评估方法论,助你掌握系统性能量化与优化的核心技能。

rong_ha_ha的博客 6330

AcWing算法基础课----数学知识(四) 笔记 ( 容斥原理 + 简单博弈论 )

数学知识容斥原理简单博弈论NIM游戏公平组合游戏ICG有向图游戏Mex运算SG函数有向图游戏的和 容斥原理 简单博弈论 NIM游戏 给定N堆物品,第i堆物品有Ai个。两名玩家轮流行动,每次可以任选一堆,取走任意多个物品,可把一堆取光,但不能不取。取走最后一件物品者获胜。两人都采取最优策略,问先手是否必胜。 我们把这种游戏称为NIM博弈。把游戏过程中面临的状态称为局面。整局游戏第一个行动的称为先手,第二个行动的称为后手。若在某一局面下无论采取何种行动,都会输掉游戏,则称该局面必败。 所谓采取最优策略是指

qq_45830025的博客 429

SAP MM新手避坑指南:工厂间调拨用301还是303?手把手教你选对移动类型

本文深入解析SAP MM模块中工厂间调拨的301与303移动类型,帮助新手避开常见陷阱。通过对比一步法(301)和两步法(303+305)的核心差异、适用场景及财务影响,提供清晰的决策框架和实战技巧,确保库存调拨的准确性和效率。

weixin_29223603的博客 349

Acwing - 算法基础课 - 笔记(数学知识 · 四)(补)

容斥原理 & 简单博弈论

vcj1009784814的博客 1255

学Simulink--基础微电网场景实例:基于Simulink的微电网并网/孤岛无缝切换控制仿真

本文完成了基于 Simulink 的微电网并网/孤岛无缝切换控制仿真,实现了:✅ 构建含双模式逆变器的微电网模型✅ 实现预同步 + Stateflow 逻辑的智能切换✅ 验证计划与非计划切换的性能边界✅ 证明“无缝”在工程上是可实现的。

amy_mhd的博客 102

SAP Group Reporting入门指南(3)--公司间匹配对账ICMR及合并版本等主数据

S/4HANA CLOUD公司间匹配和对账

bflyfish的博客 965

算法常用数学知识

线性筛质数 Acwing1292.哥德巴赫猜想 Acwing1293.夏洛克和他的女朋友每一条边都是从质数连到非质数, 因此是二分图 Acwing195.质数距离寻找在区间[l,r][l, r][l,r]之间, 相邻质数差值最大和最小的一对范围比较小的时候, 直接筛出质数, 然后在区间中进行扫描即可, 但该题数据范围非常大, 因此不能直接扫描先找出[1,50000][1, 50000][1,50000]所有的质因子, 对于全部区间的数字, 如果该数字是合数, 必然存在一个[1,50000][1, 50000

Ayanami_Rei的博客 1786

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

算法基础课-数学知识

数学知识

Crescenx的博客 626

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

算法竞赛数学知识大全

质数定义:一个大于1的自然数,除了1和它本身外,不能被其他自然数整除,换句话说就是该数除了1和它本身以外不再有其他的因数,这个数就是质数。时间复杂度O(n)O(\sqrt n)O(n​) 一个数 xxx 分解成两个数的乘积,则这两个数中,一定有一个数大于x\sqrt xx​,一个数小于根号x\sqrt xx​。 所以,可以用 xxx 除以 2~x2 ~\sqrt x2~x​ 中的每个数,如果出现了余数为 0,则这个数不是质数,如果没有出现余数为 0,则这个数是质数。 分解质因数 时间复杂度O(n)O(\sq

m0_70897036的博客 1440

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

数学知识总结

数学知识总结

go back 344

算法基础之数学知识模板

文章目录一、数论1.质数(1)试除法判断质数(2)试除法分解质因数 一、数论 1.质数 (1)试除法判断质数 bool isnum(int x)//最基础的方法 { int sqrt_x = sqrt(x); if(x < 2) return false; else{ for(int i = 2; i <= sqrt_x; ++i)//或i <= n / i if(!(x % i))

qq_45862064的博客 299

基础数学知识

基础数学知识质数试除法判定质数试除法分解质因数筛法求质数个数朴素的筛法埃氏筛线性筛约数试除法求一个数的所有约数求一个数的约数个数求一个数的约数之和欧几里得算法(辗转相除法)欧拉函数快速幂扩展欧几里得算法中国剩余定理高斯消元组合计数容斥原理博弈论 下面有的例题可能有多组测试数据,我写的时间复杂度只是一组的时间复杂度,还请注意 质数 质数的定义:大于1的数中,只有1和它本身两个约数的数(小学知识) 与质数相关的有一些算法 试除法判定质数 通过试除,判定一个数是不是质数,时间复杂度O(sqrt(n)) 例题:Ac

csdnwqy030429的博客 2498

《算法竞赛进阶指南》数论篇

《算法竞赛进阶指南》数论篇(1)-最大公约数,素数筛,欧拉函数,同余,欧拉定理,BSGS 《算法竞赛进阶指南》数论篇(1)-最大公约数,素数筛,欧拉函数,同余,欧拉定理,BSGS_axtices的博客-优快云博客 《算法竞赛进阶指南》数论篇(2)-扩展欧几里得,线性同余方程,中国剩余定理,高次同余方程,矩阵乘法,高斯消元,线性空间,线性基 《算法竞赛进阶指南》数论篇(2)-扩展欧几里得,线性同余方程,中国剩余定理,高次同余方程,矩阵乘法,高斯消元,线性空间,线性基_axtices的博客-优快云

青少年趣味编程 578

0x30数学知识(更新中)

contents:质数Prime Distance poj2689线性筛板子:阶乘分解约数倍数法反素法余数之和Hankson的趣味题Visible Lattice Points (POJ2090)同余矩阵乘法最幸运的数字高斯消元与线性空间Sumdiv poj1845同余方程组合计数容斥原理与mobius函数概率与数学期望0/1分数规划博弈论之SG函数 质数 Prime Distance poj2689 链接: link. 线性筛板子: bool st[N]; int primes[N], cnt; voi

MoRan0_0的博客 2482

AcWing基础算法课Level-2 第四讲 数学知识

AcWing基础算法课Level-2 第四讲 数学知识 您将学会以下数学名词 质数,试除法,埃式筛法,线性筛,辗转相除,算术基本定理,质因数分解,欧拉函数,快速幂,费马小定理,逆元,拓展欧几里得,一次同余方程,同余方程组,中国剩余定理,线性方程组,高斯消元,组合数,卢卡斯定理,卡特兰数,容斥原理,博弈论,NIM游戏, SG函数, Mex运算。 质数 AcWing 866. 试除法判定质数2425人打卡 AcWing 867. 分解质因数2276人打卡 AcWing 868. 筛质数2204人打卡

小哈里的博客 1018

OI数学知识清单

OI常用的数学知识总结 本文持续更新…… 总结一下OI中的玄学知识 先列个单子,(from秦神 数论 模意义下的基本运算和欧拉定理 筛素数和判定素数欧几里得算法及其扩展[finish] 数论函数和莫比乌斯反演 斐波那契数列及其性质 卡特兰数(在组合) 快速幂 离散对数和大步小步 二次剩余 原根 中国剩余定理 Pollard@Rho Farey序列 勾股数生...

weixin_30764137的博客 303
上一篇: 深入了解C++中的多态及其实现原理
下一篇: 朴素遗传算法的C++实现
魔术师的徒弟
博客等级 码龄5年 1199粉丝 142原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值