数论&数学

数论&数学

数论+数学从入门到放弃

(因为博主数论非常不好,如果写错了请及时提醒博主)

组合数学

数论里面非常常用的东西

组合数公式

  • \(\dbinom{n}{m} = \dfrac{n!}{m!(n-m)!}\)
  • \(\dbinom{n}{m} = \dbinom{n}{n-m}\)
  • \(\dbinom{n}{m} = \dbinom{n-1}{m} + \dbinom{n-1}{m-1}\)
  • \(\dbinom{n}{m+1} = \dbinom{n}{m} \times \dfrac{n-m}{m+1}\)

阶乘计算组合数取模

(注意模数为质数)

首先预处理阶乘

    jc[0] = 1;
    for(int i = 1; i <= n; i ++)
        jc[i] = (jc[i - 1] * i) % mod;

然后预处理阶乘逆元

power为带模的快速幂)

    inv[n] = power(jc[n], mod - 2);
    for(int i = n - 1; i >= 0; i --)
        inv[i] = (inv[i + 1] * (i + 1)) % mod;

卢卡斯定理

一般用来计算模数较小但数据范围很大的组合数

\(\dbinom{n}{m} \equiv \dbinom{n\bmod p}{m\bmod p} \times \dbinom{n \div p}{m \div p} \pmod{p}\)

若出现n < m的情况,则答案为0

多重集

多重集是指包含重复元素的广义集合

多重集的排列数

设值为\(a_i\)的数有\(n_i\)个,\(n = \sum n_i\) ,那么该集合的全排列个数为

\(\dfrac{n!}{\prod n_i!}\)

Catalan数列

\(Cat_n = \dfrac{C^n_{2n}}{n + 1} = C^n_{2n} - C^{n - 1}_{2n}\)

以下问题与Catalan数列相关

  • n0n1,排成长度为2n的序列,满足任意前缀中0的个数不少于1的个数的序列的数量为\(Cat_n\)
  • n个左括号和n个右括号组成的合法括号序列的数量为\(Cat_n\)
  • n个元素经过一个栈,形成的合法出栈序列数量为\(Cat_n\)
  • n个节点构成的不同二叉树的数量为\(Cat_n\)
  • 在平面直角坐标系上,每一步只能向上或右走,从(0,0)走到(n,n)并且除两个端点外不触碰到直线y = x的路线数量为\(2Cat_{n-1}\)

质数

质数的判定

使用试除法,用小于等于sqrt(x)的数试除 x 若能除尽,则 x 为合数

bool prime(int x) {
    if(x == 2)return 1;
    if(x % 2 == 0 || x == 1)return 0;
    for(int i = (int)sqrt(x) | 1; i >= 3; i -= 2)
        if(x % i == 0)return 0;
    return 1;
}

质数的筛选

//复杂度很低的筛法
for(int i = 2; i <= n; i ++)
    if(! w[i]) {
        p[ ++cnt] = i;
        for(int j = 2; j <= i; j ++)w[i * j] = 1;
    }
for(int i = 2; i <= n; i ++) {
    if(! w[i])p[ ++cnt] = i;
    for(int j = 1; j <= cnt && i * p[j] <= n; j ++) {
        w[i * p[j]] = 1;
        if(i % p[j] == 0)break;
    }
}

线性筛

(一般情况不需要使用)

从小到大累积质因子

//线性筛法
int v[MAXN], prime[MAXN];
void primes(int n) {
    memset(v, 0, sizeof(v));//最小质因子
    m = 0;//质数数量
    for(int i = 2; i <= n; i ++) {
        if(v[i] == 0)
            v[i] = i, prime[++ m] = i;
        //给当前的数i乘上一个质因子
        for(int j = 1; j <= m; j ++) {
            //i有比prime[j]更小的质因子就停止循环
            if(prime[j] > v[i] || prime[j] > n / i)break;
            //prime[j]是合数i*prime[j]的最小质因子
            v[i * prime[j]] = prime[j];
        }
        }
}

同余

扩展欧几里得算法

求不定方程ax + by = gcd(a,b)的一组特解

void exgcd(int a, int b, int &d, int &x, int &y) {
    b ? exgcd(b, a % b, d, y, x), y -= x * (a / b) : d = a, x = 1, y = 0;
}

乘法逆元

若整数B满足\(B \equiv \dfrac{1}{A} \pmod{P}\) ,则称BA在模P意义下的乘法逆元

逆元的求法

  • P为质数,可用快速幂求出:\(B = A^{P-2} \bmod P\)
  • 解线性同余方程:\(P x + A y = 1\)答案即为y的值
  • 递推:\(inv[i] = P - (P \div i \times inv[P \bmod i]) \bmod P\)

转载于:https://www.cnblogs.com/akakw1/p/9923857.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值