数论总结 (常用定理+ 模板)

刷了好几天的数论了

noip要考的几乎都刷了一遍

看着公式有生无可恋的感觉啊

下面是一些总结

1.组合数

去年的noip考了组合数递推公式

C(n, m) = C(n - 1, m - 1) + C(n - 1, m);

还有可以通过二项式定理推出来的几个结论

C(n, 0) + C(n, 1) + C(n, 2) + ... + C(n, n) = 2n

ΣC(n, i) = 2n - 1  (i 为基数或 i 为偶数)

2.(扩展)欧几里德算法

欧几里德算法

1 void gcd(ll a, ll b) {
2     return (b == 0) ? a : gcd(b, a % b);
3 }

扩展欧几里德算法

用于求不定方程 ,逆元啊等等

可以求出  ax + by = gcd (a,  b) 的一组解 x, y,并且|x| + |y| 最小。

1 void exgcd(ll a, ll b, ll& d, ll& x, ll &y) {
2     if (!b) { d = a; x = 1; y = 0; }
3     else { exgcd(b, a % b, d, y, x); y -= x*(a/b); }
4 }

3.欧拉函数

φ(n) = n (1 - 1 / p1) (1 - 1 / p2) ... (1 - 1 / pk);

线性求欧拉函数

inline ll GetPhi(ll a) {
    ll res = a;
    for (int i = 2; i * i <= a; i++)
        if (a % i == 0) {
            res = res / i * (i - 1);
            while (a % i == 0)    a /= i;
        }
    if (a > 1)    res = res / a * (a - 1);
    return res;
}

筛法求欧拉函数 (顺便可以求素数

ll phi[N + 10], p[N >> 1], tot;
bool f[N] = {1, 1};
inline void GetPhi() {
    phi[1] = 1;
    for (int i = 2; i <= N; i++) {
        if (! f[i]){
            p[tot++] = i;
            phi[i] = i - 1;
        }
        for (int j = 0; j < tot && p[j] * i <= N; j++) {
            f[p[j] * i] = true;
            if (i % p[j])    phi[i * p[j]] = phi[i] * (p[j] - 1);
            else    phi[i * p[j]] = phi[i] * p[j];
        }
    }
}

3.费马小定理

这个应该都知道啦

ap - 1 ≡ 1 (mod p)

4.线性筛素数

int p[N], tot;
inline void prime(int n) {
    f[0] = true; f[1] = true;
    for (int i = 2; i <= n; i++) {
        if (!f[i])    p[tot++] = i;
        for (int j = 0; j < tot && i * p[j] <= n; j++) {
            f[i * p[j]] = true;
            if (i % p[j] == 0)    break;
        }
    }
}

4.逆元

5.组合数取模(卢卡斯定理)

(待补充...)

时间: 2024-12-15 13:44:09

数论总结 (常用定理+ 模板)的相关文章

ACM数论中相关定理(不断更新)

费马小定理是数论中的一个重要定理,其内容为: 假如p是质数,且(a,p)=1,那么 a^(p-1) ≡1(mod p).即:假如a是整数,p是质数,且a,p互质,那么a的(p-1)次方除以p的余数恒等于1. 费马大定理,又被称为“费马最后的定理”,由法国数学家费马提出.它断言当整数n >2时,关于x, y, z的方程 x^n + y^n = z^n 没有正整数解.被提出后,经历多人猜想辩证,历经三百多年的历史,最终在1995年被英国数学家安德鲁·怀尔斯证明. 中国剩余定理的结论: 令任意固定整数

大组合数取模之lucas定理模板,1&lt;=n&lt;=m&lt;=1e9,1&lt;p&lt;=1e6,p必须为素数

typedef long long ll; /********************************** 大组合数取模之lucas定理模板,1<=n<=m<=1e9,1<p<=1e6,p必须为素数 输入:C(n,m)%p 调用lucas(n,m,p) 复杂度:min(m,p)*log(m) ***********************************/ //ax + by = gcd(a,b) //传入固定值a,b.放回 d=gcd(a,b), x , y

计算几何 部分常用函数模板

来自<算法竞赛入门经典-训练指南> 刘汝佳/陈峰 清华大学出版社 #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> #include <cmath> using namespace std; const double eps = 1e-8; int dcmp(double x) /

常用JS模板

var _win, _doc, _stt, _do = document.domain, _arr = _do.split("."); function _st() { try { document.domain = _arr.join("."); _arr.shift(); }catch(e){ document.domain = _do; _arr = _do.split("."); _arr.shift(); } if(document.f

linux: 几个常用makefile模板

不才,总结个人常用makefile模板,以备后用. 1.编译动态库 [plain] view plain copy ############################################################# # Makefile for shared library. # 编译动态链接库 ############################################################# #set your own environment o

织梦(dede)底层模板概念、常用底层模板字段

织梦(dede)底层模板概念.常用底层模板字段 一.底层模板的概念以及调用方式: 1. 什么是底层模板? 底层模板不是一个模板! 他就是在实际页面当中所要显示的具体内容: 2. 底层模板的应用: 调用方式 [field:字段名/] 实例: {dede:arclist row='6' titlelen='20'}          <li><a href="[field:arcurl/]" title="[field:fulltitle/]">

TP框架的模板路径问题以及常用的模板常量的定义

在TP框架中,为了各个模块加载静态文件方便,往往是不需要按照默认的方式放置静态文件到/app/模块名/VIEWS/下面,而是在顶级目录下创建一个新的目录(比如说./tpl目录下),来存放静态文件   设置方法:                  (1):在TP的入口文件中定义:                       define( 'TMPL_PATH' , './tpl/' ); //定义模板路径                  (2):手动创建./tpl目录(注意,框架不会自动生成该

数论 --- 同余定理

声明:以下文章是借鉴了别人的再加上自己补充后的,转载请注明! 一.同余 对于整数除以某个正整数的问题,如果只关心余数的情况,就产生同余的概念. 定义1 用给定的正整数m分别除整数a.b,如果所得的余数相等,则称a.b对模m同余,记作a≡b(mod m),如 56≡0 (mod 8). 举个例子: 3%2=1 5%2=1 则有: (5-3)%=0 [同余性质] 1) 自反性 2) 传递性 3) 对称性 4) 若 a ≡ b (mod m), c ≡ d (mod m) 则 a+b ≡ b+ d(m

# 数论-组合数+lacus定理

目录 数论-组合数+lacus定理 组合数计算 lacus定理-大组合数取模 数论-组合数+lacus定理 组合数计算 为避免爆long long,\(20!\)就达到了long long 的范围,采用边乘边除的思想 ll C(ll n,ll m){ if(n<m)return 0; ll ans=1; for(ll i=1;i<=m;i++) ans=ans*(n-m+i)/i; return ans; } lacus定理-大组合数取模 卢卡斯定理:C(n,m)%p=C(n/p,m/p)*C