基础数学知识 / Math(updating)
埃氏筛:朴素筛法求素数,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)的更多相关文章
- Python之基础数学知识
一.线性代数 1.求转置 import numpy m = numpy.mat([[1, 2], [3, 4]]) print("Matrix.Transpose:") print ...
- 【基础数学知识】UVa 11314 - Hardly Hard
Problem H HARDLY HARD You have been given the task of cutting out a quadrilateral slice of cake out ...
- 一些有用的数学知识(Updating)
文章目录 拉格朗日插值公式 微分中值定理 费马引理 拉格朗日中值定理 柯西中值定理 洛必达法则 连分数(NOI2021 D2T2 考点) 定义 结论 定理1 定理2 定理3 定理4 定理5 欧拉公式 ...
- HTML5 Canvas核心技术图形动画与游戏开发(读书笔记)----第一章,基础知识
一,canvas元素 1 为了防止浏览器不支持canvas元素,我们设置“后备内容”(fallback content),下面紫色的字即为后备内容 <canvas id="canvas ...
- js生成[n,m]的随机数,js如何生成随机数,javascript随机数Math.random()
一.预备知识 Math.ceil(); //向上取整. Math.floor(); //向下取整. Math.round(); //四舍五入. Math.random(); //0.0 ~ 1 ...
- HTML5中手势原理分析与数学知识的实践
摘要:在这触控屏的时代,人性化的手势操作已经深入了我们生活的每个部分.现代应用越来越重视与用户的交互及体验,手势是最直接且最为有效的交互方式,一个好的手势交互,能降低用户的使用成本和流程,大大提高了用 ...
- unity3d 数学的数学基础和辅助类
转载注明smartdot:http://my.oschina.net/u/243648/blog/67193 1. 数学(点乘/叉乘)/unity3d的数学辅助类 2. 坐标系统(本地/世界/屏幕 ...
- 《Deep Learning》(深度学习)中文版 开发下载
<Deep Learning>(深度学习)中文版开放下载 <Deep Learning>(深度学习)是一本皆在帮助学生和从业人员进入机器学习领域的教科书,以开源的形式免费在 ...
- Cocos2d-x视频教程
目录 1. 我的技术专栏 2. 相关推荐 3. 下载链接 4. cocos2d-xx Lua+JS+C++教学视频 5. 杨丰盛Cocos2D-X游戏课程 6. [Cocos2d-x]塔防游戏开发实战 ...
随机推荐
- Linux操作系统,为什么需要内核空间和用户空间?
点击上方"开源Linux",选择"设为星标" 回复"学习"获取独家整理的学习资料! 本文以 32 位系统为例介绍内核空间(kernel sp ...
- 哈工大软件构造Lab1(2022)
目录 一.实验目标概述 二.实验环境配置 1.安装编写java程序的IDE--IntelliJ IDEA 2.安装Git 3.安装Junit 4.GitHub Lab1仓库的URL地址 三.实验过程 ...
- Erdos-Renyi随机图的生成方式及其特性
1 随机图生成简介 1.1 \(G_{np}\)和\(G_{nm}\) 以下是我学习<CS224W:Machine Learning With Graphs>[1]中随机图生成部分的笔记, ...
- CI/CD介绍以及jenkins安装 1.1
一 .CI/CD介绍 互联网软件开发和发布,形成了一套流程标准,分为几个阶段:编码,构建,集成,测试,交付,部署 持续集成(continuous integration).持续交付(conti ...
- django小项目,使用paramiko自动备份网络设备配置
原来公司开发团队人员众多,有专门对接运维需求的开发人员,现在想要实现些功能可(只)以(能)自己写了-_- | 周末在家无事,用django搞个简单的功能练练手 django安装,配置 sudo p ...
- 【Java面试】Redis存在线程安全问题吗?为什么?
一个工作了5年的粉丝私信我. 他说自己准备了半年时间,想如蚂蚁金服,结果第一面就挂了,非常难过. 问题是: "Redis存在线程安全问题吗?" 关于这个问题,看看普通人和高手的回答 ...
- 超级简单!CentOS-8 安装 MySQL 8.0,比喝水还简单
中国人不骗中国人 果然是系统和MySQL的版本越高安装越便利了 在阿里云的 CentOS-8 比喝开水还简单的安装 MySQL 8.0,开始~ 1.以 root 用户通过 CentOS 软件包管理器来 ...
- VS.NET启动显示ID为XXXX的进程当前未运行
解决办法:在启动项目根目录下用文本编辑器打开Web项目下的{X}.csproj文件,然后查找 <WebProjectProperties>,将这一对标签之间的内容全部删除,然后再打开项目就 ...
- CentOS下Python管理
一.升级Python 查看系统版本 cat /etc/redhat-release CentOS Linux release 7.4.1708 (Core) 查看Python版本 python -V ...
- CoaXPress 时间戳 Time Stamping
背景 在CXP2.0之前,CXP没有定义Time Stamping时间戳的概念,但是用户对Time Stamping是有实际需求的,比如我们要对比多台设备拍摄同一个物体不同角度的照片,或者记录触发完成 ...