数论预备知识

 1 int gcd(int x, int y) {
 2     return y == 0 ? x : gcd(y, x % y);
 3 }
 4
 5 int extgcd(int a, int b, int &x, int &y) {
 6     int d = a;
 7     if (b) {
 8         d = extgcd(b, a % b, y , x);
 9         y -= (a / b) * x;
10     } else {
11         x = 1;
12         y = 0;
13     }
14     return d;
15 }
//求解逆元
int mod_inverse(int a, int m) {
    int x, y;
    extgcd(a, m, x, y);
    return (m + x % m) % m;
}
//求欧拉函数值 O(√n)
int euler_phi(int n) {
    int res = n;
    for (int i = 2; i * i <= n; i++) {
        if (n % i == 0) {
            res -= res / i;
            while (n % i == 0) n /= i;
        }
    }
    if (n != 1) res -= res / n;
    return res;
}
 1 // O(maxn)时间内筛出欧拉函数值的表
 2 int euler[maxn];
 3 void euler_pji2() {
 4     for (int i = 0; i < maxn; i++) euler[i] = i;
 5     for (int i = 2; i < maxn; i++) {
 6         if (euler[i] == i) {
 7             for (int j = i; j < maxn; j += i) {
 8                 euler[j] -= euler[j] / i;
 9             }
10         }
11     }
12 }
 1 // 线性同余方程组
 2 // a?x £ b?(mod m?)
 3 // 返回一个(b, m)的数对
 4 pair<int, int> linear_congruence(const vector<int>& A, const vector<int>& B, const vector<int>& M) {
 5     //由于最开始没有任何限制,所以先把解设为表示所有整数的x£0(mod 1)
 6     int x = 0, m = 1;
 7
 8     for (int i = 0; i < A.size(); i++) {
 9         int a = A[i] * m, b = B[i] - A[i] * x, d = gcd(M[i], a);
10         if (b % d != 0) return make_pair(0, -1); // 无解
11         int t = b / d * mod_inverse(a / d, (M[i] / d) % (M[i] / d));
12         x += m * t;
13         m *= M[i] / d;
14     }
15     return make_pair(x % m, m);
16 }
// 中国剩余定理
// f(x) £ 0(mod n) 等价于 f(x) £ 0 (mod pa) (pa | n)
 1 //n! O(log n)
 2 int fact[maxp];
 3 //分解n! £ b pa, 返回b mod p
 4 int mod_fact(int n, int p, int &a) {
 5     a = 0;
 6     if (n == 0) return 1;
 7     int res = mod_fact(n / p, p, a);
 8     a += n / p;
 9     if (n / p % 2 != 0) return res * (p - fact[n % p]) % p;
10     return res * fact[n % p] % p;
11 }
1 //求组合数
2 int mod_comb(int n, int k, int p) {
3     if (n < 0 || k < 0 || n < k) return 0;
4     int e1, e2, e3;
5     int a1 = mod_fact(n, p , e1), a2 = mod_fact(k, p, e2), a3 = mod_fact(n - k, p, e3);
6     if (e1 > e2 + e3) return 0;
7     return a1 * mod_inverse(a2 * a3 % p, p) % p;
8 }
时间: 2024-08-08 22:07:03

数论预备知识的相关文章

[转]预备知识—程序的内存分配

因为经典,所以转发. 一.预备知识—程序的内存分配 一个由C/C++编译的程序占用的内存分为以下几个部分 栈区(stack)  —   由编译器自动分配释放,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈. 堆区(heap)   —   一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回    收.注意它与数据结构中的堆是两回事,分配方式倒是类似于链表. 全局区(静态区)(static) —,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,

word2vec 中的数学原理详解(二)预备知识

  word2vec 是 Google 于 2013 年开源推出的一个用于获取 word vector 的工具包,它简单.高效,因此引起了很多人的关注.由于 word2vec 的作者 Tomas Mikolov 在两篇相关的论文 [3,4] 中并没有谈及太多算法细节,因而在一定程度上增加了这个工具包的神秘感.一些按捺不住的人于是选择了通过解剖源代码的方式来一窥究竟,出于好奇,我也成为了他们中的一员.读完代码后,觉得收获颇多,整理成文,给有需要的朋友参考. 相关链接 (一)目录和前言 (二)预备知

《软件调试的艺术》笔记--预备知识

1.gcc的-g选项 如果要使用gdb进行调试,必须在编译时在gcc中加入-g选项,使用参数 -g 表示将源代码信息编译到可执行文件中. 如果不使用-g选项: #include <stdio.h> int main(void) { int i = 1; i = i + 1; printf("i = %d\n",i); return 0; } gcc main.c gdb a.out (gdb) b main Breakpoint 1 at 0x4004f8 (gdb) r

最大熵学习笔记(一)预备知识

  生活中我们经常听到人们说"不要把鸡蛋放到一个篮子里",这样可以降低风险.深究一下,这是为什么呢?其实,这里边包含了所谓的最大熵原理(The Maximum Entropy Principle).本文为一则读书笔记,将对最大熵原理以及由此导出的最大熵模型进行介绍,重点给出其中所涉及数学公式的理解和详细推导. 相关链接 最大熵学习笔记(零)目录和引言 最大熵学习笔记(一)预备知识 最大熵学习笔记(二)最大熵原理 最大熵学习笔记(三)最大熵模型 最大熵学习笔记(四)模型求解 最大熵学习笔

【转】关于LIS和一类可以用树状数组优化的DP 预备知识

原文链接 http://www.cnblogs.com/liu-runda/p/6193690.html 预备知识 DP(Dynamic Programming):一种以无后效性的状态转移为基础的算法,我们可以将其不严谨地先理解为递推.例如斐波那契数列的递推求法可以不严谨地认为是DP.当然DP的状态也可以是二维/三维的,某一维的含义也不仅仅是指某个数列的第几项. 树状数组(BIT or fenwick tree):一种高效地动态维护一个序列并动态求取前缀和的数据结构.修改某个元素/求一次前缀和的

C++ primer plus读书笔记——第1章 预备知识

第1章 预备知识 1. Ritchie希望有一种语言能将低级语言的效率.硬件访问能力和高级语言的通用性.可移植性融合在一起,于是他在旧语言的基础上开发了C语言. 2. 在C++获得一定程度的成功后,Stroustrup才添加了模版,这使得进行泛型编程成为可能. 3. Linux中要支持C++11,编译源文件时要使用-std = c++0x选项: g++ -std = c++0x use_auto.cpp 4. 程序执行完毕后,有些IDE自动关闭窗口,而有些IDE不关闭.为查看输出,可以在程序的最

android金阳光自动化测试——学习历程:自动化预备知识上&amp;&amp;下

章节:自动化基础篇——自动化预备知识上&&下 网易云课堂: 上:http://study.163.com/course/courseLearn.htm?courseId=712011#/learn/video?lessonId=877113&courseId=712011 下:http://study.163.com/course/courseLearn.htm?courseId=712011#/learn/video?lessonId=877114&courseId=71

Qt DLL总结【一】-链接库预备知识

1.链接库概念 静态链接库和动态链接库介绍 我们可以创建一种文件里面包含了很多函数和变量的目标代码,链接的时候只要把这个文件指示给链接程序就自动地从文件中查找符合要求的函数和变量进行链接,整个查找过程根本不需要我们操心. 这个文件叫做 "库(Libary)",平时我们把编译好的目标代码存储到"库"里面,要用的时候链接程序帮我们从库里面找出来. 静态链接库: 在早期库的组织形式相对简单,里面的目标代码只能够进行静态链接,所以我们称为"静态库",静态

2. 自然语言处理预备知识

自然语言处理的预备知识 熟练掌握Python 微积分,线性代数 (MATH 51, CME 100) 基本的概率论和统计(CS109) 机器学习基础(CS229) 自然语言处理参考书 Dan Jurafsky and James H. Martin. Speech and Language Processing (3rd ed. draft) [link] Yoav Goldberg. A Primer on Neural Network Models for Natural Language