埃氏筛:朴素筛法求素数,o(nloglogn)

int prime[N], tot;
bool st[N]; // true:not prime, false:is prime void get_primes(int n)
{
st[1] = true;
for(int i = 2; i <= n; i++)
{
if(!st[i])
{
prime[++tot] = i;
for(int j = i + i; j <= n; j += i) st[j] = true;
}
}
}

欧拉筛:线性筛法求素数,o(n)

int prime[N], tot;
bool st[N]; // true:not prime, false:is prime void get_primes(int n)
{
st[1] = true;
for(int i = 2; i <= n; i++)
{
if(!st[i]) prime[++tot] = i;
for(int j = 1; i * prime[j] <= n; j++)
{
st[i * prime[j]] = true;
if(i % prime[j] == 0) break;
}
}
}

约数个数 & 约数之和

如果 N = p1c1 * p2c2 * p3c3 * ... * pkck 

约数个数:cnt = ( c1 + 1 ) * ( c2 + 1 ) * ( c3 + 1 ) * ... * ( ck + 1 )

unordered_map<int, int> primes;

int cal(int x)
{
//分解质因数
for(int i = 2; i*i <= x; i++)
if(x % i == 0) while(x % i == 0) primes[i] ++, x /= i;
if(x > 1) primes[x] ++;
//计算约数个数
int cnt = 1;
for(auto p : primes) cnt = cnt * (p.second + 1) % mod;
return cnt;
}

约数之和:sum = ( p10 + p11 + ... + p1c1 ) * ... * ( pk0 + pk1 + ... + pkck )

unordered_map<int, int> primes;

int cal(int x)
{
//分解质因数
for(int i = 2; i*i <= x; i++)
if(x % i == 0) while(x % i == 0) primes[i] ++, x /= i;
if(x > 1) primes[x] ++;
//计算约数之和
int sum = 1;
for(auto p : primes)
{
int a = p.first, b = p.second;
int res = 1;
while(b--) res = (res * a + 1) % mod;
sum = sum * res % mod;
}
return sum;
}

欧几里得算法:求最大公约数

int gcd(int a, int b)
{
return b ? gcd(b, a % b) : a;
}

快速幂:快速求某数的次幂

int qmi(int m, int k, int p)
{
int res = 1 % p;
while(k)
{
if(k&1) res = res * m % p;
m = m * m % p;
k >>= 1;
}
return res;
}

欧拉函数:φ(n):小于或等于n的正整数中与n互质的数的数目

设 N = p1c1 * p2c2 * p3c3 * ... * pkck  

则 φ(N) = N * ( 1 - 1/p1 ) * ( 1 - 1/p2 ) * ( 1 - 1/p3 ) * ... * (1 - 1/pk )

朴素算法:o(n1/2) // n为所求数的大小

int phi(int x)
{
int res = x;
for(int i = 2; i*i <= x; i++)
if(x % i == 0)
{
res = res / i * (i - 1); // res = res * (1 - 1/i)
while(x % i == 0) x /= i;
}
if(x > 1) res = res / x * (x - 1);
return res;
}

筛法求欧拉函数:o(n) // n为求欧拉函数的数的个数

int primes[N], tot, euler[N];
bool st[N]; void get_euler(int n)
{
euler[1] = 1;
for(int i = 2; i <= n; i++)
{
if(!st[i])
{
primes[++tot] = i;
euler[i] = i - 1;
}
for(int j = 1; i * primes[j] <= n; j++)
{
int t = i * primes[j];
st[t] = true;
if(i % primes[j] == 0)
{
euler[t] = euler[i] * primes[j];
break;
}
// euler[t] = euler[i] * primes[j] * (1 - 1/primes[j])
euler[t] = euler[i] * (primes[j] - 1);
}
}
}

欧拉定理:若a、p为正整数,且互素,则aφ(p) ≡ 1 (mod p)

用欧拉定理直接求乘法逆元的代码量较大且时间复杂度较高,不太建议。

费马小定理:若a、p为正整数,且p为素数,则ap-1 ≡ 1 (mod p) (欧拉定理的特殊情况)

故当满足以上条件时(模数p为素数),可用费马小定理结合快速幂求乘法逆元:

int qmi(int m, int k, int p)
{
int res = 1 % p;
while(k)
{
if(k&1) res = res * m % p;
m = m * m % p;
k >>= 1;
}
return res;
} int inv(int a, int p)
{
return qmi(a, p-2, p);
}

裴蜀定理

对于任意正整数a、b,一定存在整数x、y,使得 ax + by = gcd(a, b)

并且假设有ax0 + by0 = gcd(a, b),

则有通解:x = x0 + K·(b/d),y = y0 - K·(a/d) ( d = gcd(a, b),K ∈ Z ) .

其中,求解x0、y0的构造见扩展欧几里得算法

扩展欧几里得算法:求x, y,使得ax + by = gcd(a, b)

int exgcd(int a, int b, int &x, int &y)
{
if (!b)
{
x = 1; y = 0;
return a;
}
int d = exgcd(b, a % b, y, x);
y -= (a/b) * x;
return d;
}

应用:解线性同余方程、求乘法逆元

// 拓展欧几里得算法求逆元
int exgcd(int a, int b, int &x, int &y)
{
if (!b)
{
x = 1; y = 0;
return a;
}
int d = exgcd(b, a % b, y, x);
y -= (a/b) * x;
return d;
} int inv(int a, int p)
{
int x, y;
int g = exgcd(a, p, x, y);
return g != 1 ? -1 : (x % p + p) % p; //返回-1表示乘法逆元不存在
}

约瑟夫问题

n 个人标号0~n-1,逆时针站一圈。从0号开始,每一次从当前的人逆时针数k个,然后让这个人出局。问最后剩下的人是谁。

  线性算法:

int josephus(int n, int k)
{
int res = 0;
for(int i = 1; i <= n; i++) res = (res + k) % i;
return res; //若编号从1开始则res+1, 从0开始则不需要
}

欧拉降幂

  

基础数学知识 / Math(updating)的更多相关文章

  1. Python之基础数学知识

    一.线性代数 1.求转置 import numpy m = numpy.mat([[1, 2], [3, 4]]) print("Matrix.Transpose:") print ...

  2. 【基础数学知识】UVa 11314 - Hardly Hard

    Problem H HARDLY HARD You have been given the task of cutting out a quadrilateral slice of cake out ...

  3. 一些有用的数学知识(Updating)

    文章目录 拉格朗日插值公式 微分中值定理 费马引理 拉格朗日中值定理 柯西中值定理 洛必达法则 连分数(NOI2021 D2T2 考点) 定义 结论 定理1 定理2 定理3 定理4 定理5 欧拉公式 ...

  4. HTML5 Canvas核心技术图形动画与游戏开发(读书笔记)----第一章,基础知识

    一,canvas元素 1 为了防止浏览器不支持canvas元素,我们设置“后备内容”(fallback content),下面紫色的字即为后备内容 <canvas id="canvas ...

  5. js生成[n,m]的随机数,js如何生成随机数,javascript随机数Math.random()

    一.预备知识 Math.ceil();  //向上取整. Math.floor();  //向下取整. Math.round();  //四舍五入. Math.random();  //0.0 ~ 1 ...

  6. HTML5中手势原理分析与数学知识的实践

    摘要:在这触控屏的时代,人性化的手势操作已经深入了我们生活的每个部分.现代应用越来越重视与用户的交互及体验,手势是最直接且最为有效的交互方式,一个好的手势交互,能降低用户的使用成本和流程,大大提高了用 ...

  7. unity3d 数学的数学基础和辅助类

    转载注明smartdot:http://my.oschina.net/u/243648/blog/67193 1.  数学(点乘/叉乘)/unity3d的数学辅助类 2.  坐标系统(本地/世界/屏幕 ...

  8. 《Deep Learning》(深度学习)中文版 开发下载

    <Deep Learning>(深度学习)中文版开放下载   <Deep Learning>(深度学习)是一本皆在帮助学生和从业人员进入机器学习领域的教科书,以开源的形式免费在 ...

  9. Cocos2d-x视频教程

    目录 1. 我的技术专栏 2. 相关推荐 3. 下载链接 4. cocos2d-xx Lua+JS+C++教学视频 5. 杨丰盛Cocos2D-X游戏课程 6. [Cocos2d-x]塔防游戏开发实战 ...

随机推荐

  1. Linux强制用户首次登录修改密码

    一个执着于技术的公众号 地方 前言 Linux强制用户首次登陆修改密码,这应该是RHCE认证中用户管理部分, 属于很基础的内容了.可是我忘记了,所以就有了下面的记录~ 实验过程 1.创建用户并设置登录 ...

  2. QT快速入门

    QT快速入门 本文档将介绍QT工程的创建.UI界面布局,并以计数器为例了解QT中多线程的用法,最终完成一个基础的QT项目. 1 创建QT工程文件 在安装好QT之后,能够在其安装组件中找到Qt Crea ...

  3. Java学习笔记-基础语法Ⅷ-泛型、Map

    泛型 泛型本质上是参数化类型,也就是说所操作的数据类型被指定为一个参数,即将类型由原来的具体的类型参数化,然后在使用/调用时传入具体的类型,这种参数类型可以用在类.方法和接口中,分别为泛型类.泛型方法 ...

  4. mysql5.7介绍和安装

    环境准备: 1.关闭防火墙和selinux systemctl stop firewalldsystemctl stop SElinux 2. 如果安装过mariadb需要停止且卸载服务 system ...

  5. idea maven 依赖还原不上的问题 method <init>()V not found

    问题 还原项目依赖的时候报错: java.lang.RuntimeException: org.codehaus.plexus.component.repository.exception.Compo ...

  6. 女朋友面试回来抱怨说会redis,面试官问了一堆redis

    Redis 优缺点及特点 什么是Redis?简述它的优缺点? Redis本质上是一个Key-Value类型的内存数据库,类似MemoryCache,整个数据库统统加载在内存当中进行操作,定期通过异步操 ...

  7. Celery-Task参数方法

    @celery.task(bind=True, name='name') def function_name(): pass # task方法参数 name : 可以显式指定任务的名字:默认是模块的命 ...

  8. Windows环境下安装RabbitMQ

    本地安装RabbitMQ安装注意事项: Erlang与RabbitMQ,安装路径都应不含空格符. Erlang使用了环境变量HOMEDRIVE与HOMEPATH来访问配置文件.erlang.cooki ...

  9. 解决Docker运行命令时提示"Got permission denied while trying to connect to the Docker daemon socket"类情况

    Docker安装命令: 解决Docker运行命令时提示"Got permission denied while trying to connect to the Docker daemon ...

  10. 从零开始学Java——个人笔记(持续更新中)

    从零开始学Java 学习流程 第一阶段:建立编程思想 Java概述 变量 运算符 控制结构 数组.排序和查找 面向对象编程(基础) 面向对象编程(中级) 项目&学习以致用 编程之乐 第二阶段: ...