noip2017考前基础复习——数论数学

·最大公约数 gcd

辗转相除法  gcd(a,b)=gcd(b,a%b)

1 int gcd(int x,int y){
2     if(y==0) return x;
3     return gcd(y,x%y);
4 }

效率O(logn)

·最小公倍数 lcm

可由最大公约数推来 lcm(a,b)=a*b/gcd(a,b)

1 int lcm(int x,int y){
2     int p=gcd(x,y);
3     return a*b/p;
4 }

效率O(logn)

·扩展欧几里得 extgcd

求ax+by=gcd(a,b)的整数对(x,y)

也可由gcd推过来

推导过程:

ax+by=gcd(a,b)=gcd(b,a%b)

假设求出 bx‘+(a%b)y‘=gcd(b,a%b)

那么整理可得 bx‘+(a-(a/b)*b)y‘=gcd(b,a%b)

ay‘+b(x‘-(a/b)*y‘)=gcd(b,a%b)=gcd(a,b)

故 x=y‘  y=x‘-(a/b)*y‘

1 int extgcd(int a,int b,int &x,int &y){ //返回值为gcd(a,b)
2     if(b==0) {
3         x=1;y=0;
4         return a;
5     }
6     int d=extgcd(b,a%b,y,x);
7     y-=(a/b)*x;
8     return d;
9 }

可用于求同余方程、逆元

效率O(logn)

·素数筛

线性筛法,很好理解

由于每个合数都只会被筛掉一次,复杂度O(n)

 1 void Get_Prime(int n){
 2     p[0]=p[1]=0;
 3     cnt=0;
 4     for(int i=2;i<=n;i++) p[i]=1;  //先标记2~n都为素数
 5     for(int i=2;i<=n;i++){
 6         if(p[i]) prime[++cnt]=i;  //i为素数
 7         for(int j=1;j<=cnt && (long long)i*prime[j]<=n;j++){
 8             p[i*prime[j]]=1;  //每个合数都只被自己最小质因子筛掉
 9             if(i%prime[j]==0) break;
10         }
11     }
12 }

·欧拉函数 phi

求小于n与n互素的数的个数

phi[i]=i*(1-1/p1)*(1-1/p2)*(1-1/p3)……  其中p1,p2,p3为i的质因数

可以在线性筛素数的同时求,复杂度O(n)

 1 void get_phi(){
 2     p[0]=p[1]=0;cnt=0;
 3     for(int i=2;i<=n;i++) p[i]=1;
 4     for(int i=2;i<=n;i++){
 5         if(p[i]==1) phi[i]=i-1,prime[++cnt]=i;
 6         for(int j=1;j<=cnt && (ll)i*prime[j]<=n;j++){
 7             p[i*prime[j]]=0;
 8             if(i%prime[j]==0) {
 9                 phi[i*prime[j]]=phi[i]*prime[j];
10                 break;
11             }
12             phi[i*prime[j]]=phi[i]*(prime[j]-1);
13         }
14     }
15 }

·快速幂

可以把幂想成一个二进制数来理解

1 int Power_Mod(int x,int y){  //求x的y次方
2     int ret=1;
3     while(y){
4         if(y&1) ret*=x;
5         x=x*x;
6         y>>=1;
7     }
8     return ret;
9 }

效率O(logn)

·排列组合

1)加法原理:做一件事有n类做法,第n类有m[n]种做法,总做法数为m[1]+m[2]+...+m[n]

2)乘法原理:做一件事有n个步骤,第n个步骤有m[n]中做法,总做法数为m[1]*m[2]*...*m[n]

乘法原理可以说是加法原理的特殊情况

3)容斥原理   **这很重要**

例如:求gcd(1~m,1~n)=k的数对有多少

设满足条件的数对有f(k)个

则f(k)=(m/k)*(n/k)-f(2*k)-f(3*k)-f(4*k)-……从后往前递推计算即可

4)排列:A(m,n)=m!/(m-n)!  (m>n)

5)组合:C(m,n)=m!/((m-n)!*n!)  (m>n)

如何求组合数?

法一:C(m,n)=C(m,n-1)*(m-n+1)/n

法二:杨辉三角  C(m,n)=C(m-1,n)+C(m-1,n-1)

·概率与数学期望

1)概率:P(A)=m/n  (可理解为事件A发生的频率)

互相独立的事件A与B 满足 P(A*B)=P(A)*P(B)

2)数学期望:随机变量X的数学期望EX是所有可能的值按照概率加权的和

期望的线性性质:E(X+Y)=E(X)+E(Y)

未完待续……

时间: 2024-11-05 21:58:08

noip2017考前基础复习——数论数学的相关文章

C#语言和数据库技术基础复习

整理了下C#语言和数据库技术基础,作为复习资料 第一章 一.c#和JAVA对比:1.c#用命名空间(namespace)java用包(package) 2.引入命名空间或包的关键字C#用using,JAVA用import 3.程序入口:C#的Main()有四种形式static void Main(string[] args) static int Main(string[] args) static void Main() static int Main() JAVA的MAIN()有一种形式 4

C++基础复习

一. C++与C的比较: C语言是一个结构化语言,它的重点在于算法和数据结构,C语言的设计首先要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到的输出(或实现过程(事物)控制). C++,首要考虑的是如何构造一个对象模型,让这个模型能够契合与之对应的问题域,这样就可以通过获取对象的状态信息得到输出或实现过程(事物)控制. 所以C语言和C++的最大区别在于它们解决问题的思想不同,一个面向过程一个面向对象. C++对C的"增强",表现在六个方面: 1.类型检测更为严格. 2.

温故知新,基础复习(快速排序及优化)

温故知新,基础复习(快速排序及优化) 使用了三值取中和插排优化 #include<stdio.h> #define InsertSortNumber 10 void InsertSort(int Arra[],unsigned int LowIndex,unsigned int HighIndex) { printf("low=%d,high=%d\n",LowIndex,HighIndex); for (unsigned int i = LowIndex + 1; i &

温故知新,基础复习(二叉堆排序)

温故知新,基础复习(二叉堆排序) 最小堆(最终数组的数据是降序),最大堆(最终数组的数据是升序) 下例是最小堆 #include <stdio.h> #include <stdlib.h> void Swap(int Arra[],unsigned int LeftIndex,unsigned int RightIndex) { int TeampValue = Arra[LeftIndex]; Arra[LeftIndex]=Arra[RightIndex]; Arra[Righ

温故知新,基础复习(一个有序从大到小不重复的数列,任意给出一个sum值,求出数列中所有满足和为sum的数对)

温故知新,基础复习(一个有序从大到小不重复的数列,任意给出一个sum值,求出数列中所有满足和为sum的数对) #include<stdio.h> #include<stdlib.h> void PrintSumNumbers(int Arra[],int ASize,int Sum) { //O(1) if (ASize<2) { printf("The size of the Arra is invalid.\n"); return; } if(Sum&

软件开发技术基础复习要点

软件开发技术基础复习要点 1.生存周期: 指一个软件从提出开发要求开始,经过需求分析.设计.制造.调试.使用.维护,直到软件产品被淘汰为止的整个过程. 2.简述软件工程的基本原理: 用分阶段的生命周期计划严格管理: 坚持进行阶段评审: 实行严格的产品控制: 采纳现代程序设计技术: 结果应该能清楚地审查: 开发小组应小而精: 承认不断改进软件工程实践的必要性. 3.简述产生软件危机的原因和解决办法: 原因:开发软件所需的高成本与软件产品的低质量之间存在尖锐的矛盾,致使软件开发陷入循环之中,即研制软

JS基础复习

js基础语法 Netcape js基础语法规范(ECMAScript1,2,3,3.1,5(IE9),6   ES    ES6=es2015) DOM BOM BOM :是由浏览器厂商各自实现的,所以差异比较大 DOM:相关的规范  是由W3C维护的 Node的优势  没有浏览器的兼容性问题 前端项目尽量不要使用ES6,需要考虑兼容性问题 --------------------------------数据类型--------------------------- 1.数据类型分类: 基本数据

c# 基础复习1

1. 类和对象 1.1 类和对象的概念 类:对象的类型,它不同于 int 等基本数据类型,因为类具有行为:也可以说是具有相 同特征和行为的一组对象的集合. 对象:对象是一个个你能看得见,摸得着的实体,是实实在在的事物,具有相同特征和 行为的对象可以抽象成类. 1.2 定义类的语法 [modifier] class ClassName { //[field,Method] } 1.3 如何创建对象 ClassName name=new ClassName(); 1.4 命名空间: 作用:用于管理类

Java 笔记之基础复习

1.& 与 &&的区别 两个都有逻辑与的功能.但是所不同的是,当&两边的表达式不是boolean类型的时候,&具有位与的功能:&&是短路与,当判断到前一个表达式为false的时候,将不会再去计算后面的表达式. 如: int i = 0; System.out.println((1==0)&(0==(i++))); System.out.println(i); 输出是: false 1 但是, int i = 0; System.out.pri