基础数学知识 / 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]塔防游戏开发实战 ...
随机推荐
- 图解 Git 工作原理
此页图解 git 中的最常用命令.如果你稍微理解git的工作原理,这篇文章能够让你理解的更透彻. 基本用法 上面的四条命令在工作目录.暂存目录(也叫做索引)和仓库之间复制文件. git add fil ...
- OpenStack计费服务
cloudkitty服务介绍 当前版本cloudkitty可以完成虚拟机实例(compute),云硬盘(volume),镜像(image),网络进出流量(network.bw.in,network.b ...
- content应用
- vmware 虚拟机系统双屏或更多屏
确保 VMware Workstation 软件已打开,且目标虚拟机已关机 编辑 > 首选项 > 显示 > 自动适应,确保 自动适应窗口.自动适应客户机 已勾选,点击 确定 保存 右 ...
- arts-week12
Algorithm 69. Sqrt(x) - LeetCode Review Cloudflare goes InterPlanetary - Introducing Cloudflare's IP ...
- 什么是请求参数、表单参数、url参数、header参数、Cookie参数?一文讲懂
最近在工作中对 http 的请求参数解析有了进一步的认识,写个小短文记录一下. 回顾下自己的情况,大概就是:有点点网络及编程基础,只需要加深一点点对 HTTP 协议的理解就能弄明白了. 先分享一个小故 ...
- Solon 1.8.0 发布,云原生微服务开发框架
相对于 Spring Boot 和 Spring Cloud 的项目 启动快 5 - 10 倍 qps 高 2- 3 倍 运行时内存节省 1/3 ~ 1/2 打包可以缩小到 1/2 ~ 1/10(比如 ...
- 直观比较 popcount 的效率差异
问题 求 \(\sum\limits_{i=1}^{3\times 10^8} popcount(i)\) . 仅考虑在暴力做法下的效率. 枚举位 __builtin_popcount #includ ...
- JAVA - 线程从创建到死亡的几种状态都有哪些?
JAVA - 线程从创建到死亡的几种状态都有哪些? 新建( new ):新创建了一个线程对象. 可运行( runnable ):线程对象创建后,其他线程(比如 main 线程)调用了该对象 的 sta ...
- mybatis-plus分页插件
package com.tanhua.server.config; import com.baomidou.mybatisplus.extension.plugins.PaginationInterc ...