算法中的数学知识(三)—容斥原理与简单博弈论(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

【NLG】(六)文本生成评价指标—— ROUGE原理及代码示例

前奏: 【NLG】(一)文本生成评价指标——BLEU原理及代码示例 【NLG】(二)文本生成评价指标—— METEOR原理及代码示例 【NLG】(三)文本生成评价指标—— ENTROPY原理及代码示例 【NLG】(四)文本生成评价指标—— diversity原理及代码示例 【NLG】(五)文本生成评价指标—— kl_divergence原理及代码示例 1.ROUGE原理 2.优缺点 3.如何算ROUGE ...

凝眸伏笔的博客 1万+

Demo2Reward:用人类演示动态优化VLM奖励模型提示

多模态大模型(VLM)的奖励建模正面临核心瓶颈——静态提示导致语义鸿沟与泛化失效。其本质是将人类判断标准固化为不可更新的文本模板,使奖励信号脱离真实任务意图。Demo2Reward提出范式级改进:以结构化人类演示为元信号,驱动提示权重连续优化,实现从‘结果打分’到‘过程理解’的跃迁。该方法不修改VLM主干,却显著提升RLHF收敛效率与OOD鲁棒性,在医疗、工业质检等场景验证了跨任务迁移与热修复能力。它重新定义了提示工程的技术价值:不是前端微调,而是奖励系统的认知校准基础设施。

weixin_34302798的博客 408

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

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

2301_79941476的博客 1088

保姆级教程:在通达信V7.611上配置欧奈尔RPS曲线(附完整公式与每日更新流程)

本文提供通达信V7.611配置欧奈尔RPS曲线的保姆级教程,涵盖从环境准备、基础设置到核心公式配置的全流程。详细讲解如何创建股票池、编写EXTRS基础公式及RPS显示公式,并附每日更新流程与实战应用技巧,帮助投资者精准捕捉强势股。

weixin_30000735的博客 464

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

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

qq_44005993的博客 293

Matlab蒙特卡洛模拟二维伊辛模型相变过程

一、什么是伊辛模型 伊辛(Ising)模型是描述磁系统相变最简单的模型,但模型里自旋之间的相互作用赋予了它奇妙的特性,最有趣的就是对称性破缺。这一模型可以被推广用于研究连续的量子相变、基本粒子超弦理论、动力学临界行为等,甚至被认为可以描述深林火灾、交通拥堵、舆论传播等社会经济现象。 如图,每个格点的方向只有向上或向下两者状态,但临近的自旋之间有相互作用,而且点阵可以是一维、二维、三维、甚至更高维...

http://www.icfgblog.com/ 2万+

搞定ESD(五):静电放电问题分析与调试

前面深入分析了静电放电的干扰机理、耦合路径,从现在开始将进入下一个大家非常关注的环节:静电放电问题分析与调试,掌握静电放电问题的分析方法,快速锁定敏感设备或者耦合路径,可以达到事半功倍的效果。

记得诚 2795

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

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

qq_45830025的博客 429

wflow模型hbv

毛管水的处理 😄 快速流的处理 K4是为了产生基流的 找到了令人激动的kenematic模块 😄

m0_46268055的博客 779

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

容斥原理 & 简单博弈论

vcj1009784814的博客 1255

TriCore架构-基于TC397在SOTA过程中AB-SWAP切换底层原理

TC397的SOTA升级机制通过硬件地址重映射实现,利用MMU将逻辑地址动态映射到不同物理地址。其PFlash支持标准/备用地址映射,通常使用PF0+PF1+PF4空间以便于OTA处理。升级时,新固件自动写入非活动分区(A/B分区切换),由地址转换函数完成逻辑地址到物理地址的转换。系统重启后根据寄存器选择启动区域,实现安全无缝的固件更新。

xiandang8023的博客 490

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

算法常用数学知识

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

Ayanami_Rei的博客 1786

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

算法基础课-数学知识

数学知识

Crescenx的博客 626

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

算法竞赛数学知识大全

质数定义:一个大于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

数学知识总结

数学知识总结

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、付费专栏及课程。

余额充值