23集训 Day4 数论
快速幂
定义
快速幂,是一个在 \(\Theta(\log n)\) 的时间内计算 \(a^n\) 的小技巧,而暴力的计算需要 \(\Theta(n)\) 的时间。
解释
\]
定义快速幂函数为 \(q(x,n)\),则
\begin{cases}
1& b=0\\
a& b=1\\
q(a,b/2)^2&b\bmod 2 = 0\\
q(a,b/2)^2\times a&b\bmod 2 = 1\\
\end{cases}
\]
实现
#include <iostream>
using namespace std;
long long a, b, p;
long long q(long long x, long long n)
{
if(n == 0) return 1;
long long r = 0;
if(n == 1) return a;
r = q(x, n / 2) % p;
r = r * r % p;
if(n % 2) r = r * x % p;
return r;
}
int main()
{
cin >> a >> b >> p;
cout << a << "^" << b << " mod " << p << "=" << q(a, b) % p;
return 0;
}
唯一分解定理
\(\forall n\in \mathbf{N}_+\) 均可以被分解为有限个质数的乘积。
调和级数
定义
\(\sum\limits_{i=1}^{n}\dfrac{1}{i}\) 被称为调和级数,它是发散的,即没有极限。
调和级数的部分和
\(\sum\limits_{i=1}^{n}\dfrac{1}{i}=\ln n + \gamma+\epsilon_k\)。其中 \(\gamma\) 是欧拉-马歇罗尼常数,而 \(\epsilon_k\approx\dfrac{1}{2k}\) ,并且随着 \(k\) 趋于正无穷而趋于 \(0\)。这个结果由欧拉给出。
gcd 与 lcm
\(\forall A,B\in\mathbf{N}_+\),根据唯一分解定理,有 \(A=\prod\limits_{i=1}^{n}p_i^{a_{i}},B=\prod\limits_{i=1}^{n}p_i^{b_{i}}\),其中 \(p_i\) 为质数。
则有 \(\gcd(A,B)=\prod\limits_{i=1}^{n}p_i^{\min(a_i,b_i)}\),\(\text{lcm}(A,B)=\prod\limits_{i=1}^{n}p_i^{\max(a_i,b_i)}\)。
还有 \(\min(a,b) +\max(a,b) = a+b\)。
所以
\gcd(A,B)\times\text{lcm}(A,B)&=\prod\limits_{i=1}^{n}p_i^{\min(a_i,b_i)}\times\prod\limits_{i=1}^{n}p_i^{\max(a_i,b_i)}\\
&=\prod\limits_{i=1}^{n}p_i^{\min(a_i,b_i)}\times p_i^{\max(a_i,b_i)}\\
&=\prod\limits_{i=1}^{n}p_i^{\min(a_i,b_i)+\max(a_i,b_i)}\\
&=\prod\limits_{i=1}^{n}p_i^{a_i+b_i}\\
&=\prod\limits_{i=1}^{n}p_i^{a_i}+\prod\limits_{i=1}^{n}p_i^{b_i}\\
&=A\times B \\
\end{aligned}
\]
自然对数的底
引入
银行推出了活动,定期存款存一年的 \(\frac{1}{n}\) 时,利率为 \(\frac{1}{n}\),求本金为 \(100\text{元}\) 时反复存取直至一年时最多能拿多少钱。
例:存半年能拿 \(100\times (1 + 50\%)^2 = 225\text{(元)}\)。
化简一下,题意就变为了:求
\]
我们定义:
\]
其中 \(e\) 是一个无理数,其值约等于 \(2.718281828459\cdots\)。
以 \(e\) 为底的对数被称为自然对数,简记为 \(\ln x\)。即 \(\log_ex=\ln x\)。
(\(\ln\) 读作 natural log,也可读作 /lɔn/)
exgcd
辗转相除法
\begin{cases}
a &b=0\\
gcd(b, a\bmod b) &\text{otherwise}\\
\end{cases}
\]
定义
扩展欧几里得算法(Extended Euclidean algorithm, EXGCD),常用于求
\]
的一组可行解。
推导过程
因为:
a\bmod b = a-b\lfloor \frac{a}{b}\rfloor
\]
就有:
ax+by&=\gcd(a,b)\\
bx'+\left(a-b\lfloor \frac{a}{b}\rfloor\right)y'&=gcd(b,a\bmod b)\\
bx'+ay'-b\lfloor \frac{a}{b}\rfloor y'&=gcd(b,a\bmod b)\\
ay'+b(x'-\lfloor \frac{a}{b}\rfloor y')&=gcd(b,a\bmod b)\\
\end{aligned}
\]
即为:
\]
当 \(b=0\) 时,有 \(x=1,y=0\)。
当 \(b\neq 0\) 时,递归求解。
Code
void exgcd(int a, int b, int &x, int &y) {
if (b == 0) {
x = 1, y = 0; //递归边界
return;
}
else {
exgcd(b, a % b, x, y);
int tmp = x;
x = y, y = tmp - a / b * y; // 继续递归
}
}
模运算意义下的逆元
定义
对于任意的 \(\gcd(a,p)=1\),存在唯一的 \(x(0\leq x\leq p-1)\),使得 \(ax\bmod p = 1\)。称 \(x\) 为 \(a\) 在 \(\bmod\ p\) 意义下的乘法逆元。
求法
exgcd
\]
证明:
\]
令 \(y=\lfloor \dfrac{ax}{p} \rfloor\),则:
\]
用 exgcd 求解即可。
欧拉定理
欧拉(Euler)定理:
\]
其中 \(\varphi\) 为欧拉函数,\(\varphi (n)\) 表示不大于 \(n\) 的整数中与 \(n\) 互质的数的个数,定义 \(\varphi(1) =1\)。
\]
\]
故 \(a\) 在 \(\bmod\ p\) 意义下的乘法逆元为 \(a^{\varphi(p)-1}\)。
费马小定理
费马小定理:当 \(p\) 为质数时,有 \(a^{p-1}\bmod p = 1\)。
故 \(a\) 在 \(\bmod\ p\) 意义下的乘法逆元为 \(a^{p-2}\)。
当 \(p\) 为质数时,\(\varphi(p)=p-1\),故费马小定理求逆元是欧拉定理求逆元的一种特殊情况。
欧拉筛
筛质数
在欧拉筛中,每一个合数都是被最小的质因子筛掉。
void init(int n) {
for (int i = 2; i <= n; ++i) {
if (!vis[i]) {
pri[cnt++] = i;
}
for (int j = 0; j < cnt && 1ll * i * pri[j] <= n; ++j) {
vis[i * pri[j]] = 1;
if (i % pri[j] == 0) { // 换言之,i 之前被 pri[j] 筛过了
// 由于 pri 里面质数是从小到大的,所以 i 乘上其他的质数的结果一定会被
// pri[j]的倍数筛掉,就不需要在这里先筛一次,所以这里直接 break 就好了
break;
}
}
}
}
因为 prime[]
中的质数是递增的,当 \(i\mid prime_j\),那么 \(i\times prime_{j+1}\) 一定会被 \(prime_j\) 乘 某个数 筛掉,接下来的数同理,因此在满足 i % prime[j] == 0
时即可 break
。
筛积性函数
积性函数的定义:
若函数 \(f(n)\) 满足 \(f(1)=1\) 且 \(\forall x,y\in\mathbf{N}_+,\gcd(x,y)=1\) 都有 \(f(x\times y)=f(x)\times f(y)\),则 \(f(n)\) 为积性函数。
将 \(x\) 分类讨论:
- \(x\) 为质数,则 \(f(x)\) 直接计算。
- \(i\bmod prime_j \neq 0\),则根据积性函数定义,有 \(f(i\times prime_j)=f(i)\times f(prime_j)\)
- \(i\bmod prime_j = 0\),则 \(i\) 的最小质因子也为 \(prime_j\),记 \(prime_j\) 在 \(i\) 的质因数中出现次数为 \(t\),显然 \(\dfrac{i}{prime_j^t}\) 与 \(prime_j^{t+1}\) 互质。所以 \(f(i\times prime_j)=f(\dfrac{i}{prime_j^t})\times f(prime_j^{t+1})\)
筛欧拉函数
易证 \(\varphi\) 为积性函数。
对于任意的质数 \(p\),有 \(\varphi(p)=p-1\),\(\varphi(p^a)=p^{a-1}(p-1)\)。
证明:
当 \(p\) 为质数时,在不大于 \(p\) 的正整数中,每 \(p\) 个数就有 \(p-1\) 个数与 \(p\) 互质。
所以 \(\varphi(p^a)=p^a\times\frac{p-1}{p} = p^{a-1}(p-1)\)。\(\Box\)
故
\varphi(n)&=\prod\varphi(p_i^{a_i})\\
&=\prod p_i^{a_i}\times \frac{p_i-1}{p_i}\\
&=\left(\prod p_i^{a_i}\right)\times \left(\prod\frac{p_i-1}{p_i}\right)\\
&=n\prod\frac{p_i-1}{p_i}
\end{aligned}
\]
将 \(x\) 分类讨论:
- \(x\) 为质数,则 \(\varphi(x)=x-1\)。
- \(i\bmod prime_j \neq 0\),则根据积性函数定义,有 \(\varphi(i\times prime_j)=\varphi(i)\times \varphi(prime_j) = \varphi(i)\times (prime_j-1)\)
- \(i\bmod prime_j = 0\),则 \(i\) 包含了 \(prime_j\) 的所有质因子,
\varphi(n) & = n \times \prod{\frac{p_i - 1}{p_i}} \\
& = prime_j \times i \times \prod{\frac{p_i - 1}{p_i}} \\
& = prime_j \times \varphi(i)
\end{aligned}
\]
Code:
//vis[i] 存储 i 是否为合数
void init() {
for (int i = 2; i <= n; ++i) {
if (!vis[i]) {
prime[++cnt] = i;
}
for (int j = 1; j <= cnt && i * prime[j] <= n; ++j) {
vis[i * prime[j]] = true;
if (i % prime[j] == 0) {
break;
}
}
}
}
博弈论
寄,没听懂
23集训 Day4 数论的更多相关文章
- Loj #6069. 「2017 山东一轮集训 Day4」塔
Loj #6069. 「2017 山东一轮集训 Day4」塔 题目描述 现在有一条 $ [1, l] $ 的数轴,要在上面造 $ n $ 座塔,每座塔的坐标要两两不同,且为整点. 塔有编号,且每座塔都 ...
- Loj 6068. 「2017 山东一轮集训 Day4」棋盘
Loj 6068. 「2017 山东一轮集训 Day4」棋盘 题目描述 给定一个 $ n \times n $ 的棋盘,棋盘上每个位置要么为空要么为障碍.定义棋盘上两个位置 $ (x, y),(u, ...
- loj6068. 「2017 山东一轮集训 Day4」棋盘 二分图,网络流
loj6068. 「2017 山东一轮集训 Day4」棋盘 链接 https://loj.ac/problem/6068 思路 上来没头绪,后来套算法,套了个网络流 经典二分图 左边横,右边列 先重新 ...
- 佳木斯集训Day4
Day4的出题人好毒瘤啊!!! T1我打表过的,正解现在也不会 #include <bits/stdc++.h> #define MAXN 10050 #define ll long lo ...
- 中山纪中集训Day4双是测试(划沝) 九校联考-DL24凉心模拟Day2
A组T1 锻造 (forging) 1.1 题目背景 勇者虽然武力值很高,但在经历了多次战斗后,发现怪物越来越难打于是开始思考是不是自己平时锻炼没到位,于是苦练一个月后发现......自己连一个史莱姆 ...
- 【五一qbxt】day4 数论知识
这些东西大部分之前都学过了啊qwq zhx大概也知道我们之前跟着他学过这些了qwq,所以: 先讲新的东西qwq:(意思就是先讲我们没有学过的东西) 进制转换 10=23+21=1010(2) =32+ ...
- 集训Day4
在bzoj刷了好几天杂题感觉手感不是很好 继续回来集训一下 好几天没更新了啊... bzoj1875 一个无向图,一个人要从起始点走$t$步走到终点,不能沿着刚走过来那条边回去,问有多少种走法 $m ...
- 长乐国庆集训Day4
T1 一道数论神题 题目 [题目描述] LYK有一张无向图G={V,E},这张无向图有n个点m条边组成.并且这是一张带权图,只有点权. LYK想把这个图删干净,它的方法是这样的.每次选择一个点,将它删 ...
- 2022寒假集训day4
day4(day5补完的) 继续刷搜索方面的题, 初步了解了序列. T1 迷宫问题 题目描述设有一个 n*n 方格的迷宫,入口和出口分别在左上角和右上角.迷宫格子中分别放 0 和 1 ,0 表示可通, ...
- 2016HUAS_ACM暑假集训4F - 数论
这个题目,如果没找到方向,确实有点一头雾水.但是如果你找对方向了,AC是分分钟的事.答案就是看n和m是否有除1之外的公约数. 简单证明:设n和m最大公约数不是1,假设为p.n和m总可以化为一个数乘以k ...
随机推荐
- 代理详解(java代理和CGLIB动态代理)
[代理]大家都知道,特别是在spring中aop.spring中的事务.spring解析注解@Configuration,以及最原始的解析spring.xml的配置,这些都是使用代理来进行实现的, ...
- PHP代码获取网址参数的数据,请收藏。
<? echo $_SERVER['HTTP_HOST']."<br>"; #localhost echo $_SERVER['PHP_SELF']." ...
- 浏览器手动设置Cookie
浏览器手动设置Cookie js代码: document.cookie="{KEY}={Value}": 可多次执执行.
- 行行AI人才直播第7期:奇计AI创始人左晟《AI时代的商业挑战和机遇》
行行AI人才是博客园和顺顺智慧共同运营的AI行业人才全生命周期服务平台,是园子商业化努力的一个重要方向. 行行AI人才直播希望以直播的方式让大家更多了解AI行业的现状与未来可能的发展方向. 随着人工智 ...
- 跟着 GPT-4 从0到1学习 Golang 并发机制(一)
目录 一.前言 二.开聊 2.1 Golang 里的并发机制介绍 2.2 Goroutine 与线程 2.3 Goroutine 与线程的调度开销 2.4 用户态和内核态 2.5 Golang 并发编 ...
- 【Mybatis】学习
Mybatis 学习 环境搭建 pom.xml <!--log4j--> <dependency> <groupId>org.slf4j</groupId&g ...
- boinc使用笔记
安装 yum install -y epel-release yum install -y boinc-client boinc-manager 启动 在图形界面开启终端 boinc boincmgr
- 单节点kafka部署笔记
1 背景 因为工作中需要对接kafka,准备在测试环境中自己部署一套,考虑方便决定部署一台单点. 2 部署 2.1 scala 2.1.1 java环境 openjdk即可,我使用的是openjdk1 ...
- .net通用RSA加密工具类
目前最流行的加密算法莫过于RSA了,以下是我们.net/.net core C#生成环境用的RSA加密工具类,在此分享给大家. using System; using System.IO; using ...
- pandas读取mysql并导出为excel
前言 业务需要从数据库导出数据为excel,并设置成自动化.这里用pandas写的数据导入导出,还算方便.配合crontab + shell脚本使用,每天晚上自动生成excel,然后cp到指定目录.s ...