20230803

数论

筛素数

素数的定义: 只有1和它本身两个因数。

埃式筛

核心思想:如果一个数\(n\)能被\(\left ( 1,n \right )\)中的数整除, 那么这个数就不是素数.

bool check(long long num) {
    if (num == 1) {
        return false;
    }
    for (long long i = 2; i * i <= num; i++) {
        if (num % i == 0) {
            return false;
        }
    }
    return true;
}

线性筛

核心思想: 如果一个数\(n\)不是\(\left ( 1,n \right )\)中任意一个数的倍数, 那么\(n\)为素数, 所有n的倍数不是素数.

for (int i = 2; i < N; i++) {
        if (visNum[i] == 0) {
            primeCnt++;
            prime[primeCnt] = i;
        }
        for (int j = 1; j <= primeCnt && prime[j] * i < N; j++) {
            visNum[prime[j] * i] = true;
            if (i % prime[j] == 0) {
                break;
            }
        }
    }

排列组合

排列

排列\(n\)个不同的数,请问有多少种排列方式?

第一个数可以是有\(n\)种选择, 第二个数有\(n-1\)种选择, 第三个数有\(n-2\)种选择, 第\(i\)个数有\(n-i+1\)种选择, \(n\)个不同的数的排列就是\(n\times \left ( n-1 \right )\times \left ( n-2 \right ) \times \left ( n-3 \right ) \cdots \times 2 \times 1\)种方式, 也就是\({\large A^{n}_{n}}\) 种排列方式

\(n\)个不同的数, 从中选\(m\)个数排列, 共有多少种排列方式?

与全部选择不同, 只需要选择到第\(m\)个数就是就可以, 就是\(n\times \left ( n-1 \right )\times \left ( n-2 \right ) \times \left ( n-3 \right ) \cdots \times \left ( n-m+2 \right ) \times \left ( n-m+1 \right )\), 也就是\({\large A^{m}_{n}}\)种选择方式

组合

\(n\)个不同的数, 从中选取\(m\)个数, 请问有多少种选取方式?

首先计算出从\(n\)个数中选择\(m\)个数共有多少种有序的方式, 然后除去数字相同但是顺序不同的情况, 也就是\({\Large \frac{A^{m}_{m}}{A^{m}_{n}}}\)种方式, 也就是\({\large C^{m}_{n}}\)种方式


排列和组合的区别在于, 排列对顺序有要求, 组合对顺序没有要求

123和321在排列中被看作是两种情况, 而在组合中被看作是一种情况.

转换思维

\(n\)个不同的人排队, 其中有两个人必须站在一起, 问有多少种排列方式?

将两个人视作同一个人排列, 然后再考虑这两个人的站位问题, ${\Large A_{n-1}^{n-1} \times A_{2}^{2}} $.

球棍模型

\(n\)个人分进\(m\)个不同的班级中, 请问有多少种方式? (可以有班级没有学生)(数据保证\(m < n\))

举例:
\(n = 5 , m = 3\)
将每个人看作一个球

将分班看作一根棍,
比如可以将1分进1班/23分进2班/45分进3班

又因为可以有班级没有学生, 那么棍子可以在球的最左边和最右边,

也就是所有学生都进了二班.
综上问题转换为在\(5+1=6\)个空隙中放入\(3-1=2\)根棍子, 共有多少种方式.
也就是在\(n+1\)个空隙中放入\(m-1\)根棍子, 共有多少种方式.
因为棍子和棍子没有区别, 所以是组合而不是排序
也就是\({\large C_{n+1}^{m-1}}\)

\(n\)个人分进\(m\)个不同的班级中, 保证每个班级至少有一名学生, 请问有多少种方式? (数据保证\(m < n\))

整体思路和上题相同, 但因为每个班级至少有一名学生, 所以棍子不可以放在最左和最右, 也就是共有\(n-1\)个空隙,答案为\({\large C_{n-1}^{m-1}}\)

快速幂

OI-WIKI链接

模板:

long long binpow(long long a, long long b) {
    long long res = 1;
    while (b > 0) {
        if (b & 1) res = res * a;
        a = a * a;
        b >>= 1;
    }
    return res;
}

题目描述
监狱有 n 个房间,每个房间关押一个犯人,有 m 种宗教,每个犯人会信仰其中一种。如果相邻房间的犯人的宗教相同,就可能发生越狱,求有多少种状态可能发生越狱。

答案对 100,003 取模。

输入格式
输入只有一行两个整数,分别代表宗教数 m 和房间数 n。

输出格式
输出一行一个整数代表答案。

输入输出样例
输入

2 3

输出

6

说明/提示
样例输入输出 1 解释

状态编号 1号房间 2号房间 3号房间
1 信仰 1 信仰 1 信仰 1
2 信仰 1 信仰 1 信仰 2
3 信仰 1 信仰 2 信仰 2
4 信仰 2 信仰 1 信仰 1
5 信仰 2 信仰 2 信仰 2
6 信仰 2 信仰 2 信仰 1

数据规模与约定
对于 100% 的数据,保证1≤m≤108,1≤n≤1012。

所有可能性数量和两两相邻两个不同的数量相减, 剩下的就是相邻两个相同的数量. 第一个有\(m\)种选择, 第二个人和第一个人不同, 所以\(m-1\)种选择, 第三个人和第二个人不同, 但可以和第一个人相同, 所以也有\(m-1\)种选择, 以此类推, 除第一个人外剩下\(n-1\)个人都有\(m-1\)种选择

#include <bits/stdc++.h>

using namespace std;

const int MOD = 100003;

long long f(long long a, long long b) {//快速幂
    long long x = 1, y = a;
    while (b >= 1) {
        if (b % 2 == 1) {
            x = x * y % MOD;
        }
        y = y * y % MOD;
        b /= 2;
    }
    return x;
}

int main() {
    long long n;
    long long m;
    cin >> m >> n;
    cout << (f(m, n) - (m * f(m - 1, n - 1)) % MOD + MOD) % MOD;
    return 0;
}

图论

有向图

边有方向的就是有向图.

连通图: 图中任意两点间均有边.

强连通图: 图中任意两点均可相互到达.

连通分量: 图中为连通图的部分.

强连通分量: 图中为强连通的部分.

无向图

将边视作双向边, 可变成有向图.

  • 树是一种有向无环图.
  • 树的根节点入度为0; 其他结点入度为1.
posted @ 2023-08-03 10:01  Eutopiax7  阅读(61)  评论(0)    收藏  举报