快速幂

定义

快速幂,是一个在 \(\Theta(\log n)\) 的时间内计算 \(a^n\) 的小技巧,而暴力的计算需要 \(\Theta(n)\) 的时间。

解释

\[\because a^{b+c}=a^{b} \times a^{c},a^{2b}=a^{b}\times a^{b}=(a^{b})^2
\]

定义快速幂函数为 \(q(x,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\)。

所以

\[\begin{aligned}
\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{(元)}\)。

化简一下,题意就变为了:求

\[\lim \limits_{n\to\infty}\left(1+\frac{1}{n}\right)
\]

我们定义:

\[\lim \limits_{n\to\infty}\left(1+\frac{1}{n}\right)=e
\]

其中 \(e\) 是一个无理数,其值约等于 \(2.718281828459\cdots\)。

以 \(e\) 为底的对数被称为自然对数,简记为 \(\ln x\)。即 \(\log_ex=\ln x\)。

(\(\ln\) 读作 natural log,也可读作 /lɔn/)

exgcd

辗转相除法

\[\gcd(a,b)=
\begin{cases}
a &b=0\\
gcd(b, a\bmod b) &\text{otherwise}\\
\end{cases}
\]

定义

扩展欧几里得算法(Extended Euclidean algorithm, EXGCD),常用于求

\[ax+by=\gcd(a,b)
\]

的一组可行解。

推导过程

因为:

\[\gcd(a,b)=\gcd(b,a\bmod b)\\
a\bmod b = a-b\lfloor \frac{a}{b}\rfloor
\]

就有:

\[\begin{aligned}
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}
\]

即为:

\[ax+by=ay'+b(x'-\lfloor \frac{a}{b}\rfloor y')
\]

当 \(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

\[ax\bmod p = 1 \Leftrightarrow ax+py=1
\]

证明:

\[\because ax\bmod p=ax-p\lfloor \frac{ax}{p}\rfloor
\]

令 \(y=\lfloor \dfrac{ax}{p} \rfloor\),则:

\[ax-py = 1
\]

用 exgcd 求解即可。

欧拉定理

欧拉(Euler)定理:

\[a^{\varphi(p)}\equiv 1 (\bmod\ p)
\]

其中 \(\varphi\) 为欧拉函数,\(\varphi (n)\) 表示不大于 \(n\) 的整数中与 \(n\) 互质的数的个数,定义 \(\varphi(1) =1\)。

\[a^{\varphi(p)}\bmod p=1
\]
\[a\times a^{\varphi(p)-1}\bmod p=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\)

\[\begin{aligned}
\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\) 的所有质因子,
\[\begin{aligned}
\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 数论的更多相关文章

  1. Loj #6069. 「2017 山东一轮集训 Day4」塔

    Loj #6069. 「2017 山东一轮集训 Day4」塔 题目描述 现在有一条 $ [1, l] $ 的数轴,要在上面造 $ n $ 座塔,每座塔的坐标要两两不同,且为整点. 塔有编号,且每座塔都 ...

  2. Loj 6068. 「2017 山东一轮集训 Day4」棋盘

    Loj 6068. 「2017 山东一轮集训 Day4」棋盘 题目描述 给定一个 $ n \times n $ 的棋盘,棋盘上每个位置要么为空要么为障碍.定义棋盘上两个位置 $ (x, y),(u, ...

  3. loj6068. 「2017 山东一轮集训 Day4」棋盘 二分图,网络流

    loj6068. 「2017 山东一轮集训 Day4」棋盘 链接 https://loj.ac/problem/6068 思路 上来没头绪,后来套算法,套了个网络流 经典二分图 左边横,右边列 先重新 ...

  4. 佳木斯集训Day4

    Day4的出题人好毒瘤啊!!! T1我打表过的,正解现在也不会 #include <bits/stdc++.h> #define MAXN 10050 #define ll long lo ...

  5. 中山纪中集训Day4双是测试(划沝) 九校联考-DL24凉心模拟Day2

    A组T1 锻造 (forging) 1.1 题目背景 勇者虽然武力值很高,但在经历了多次战斗后,发现怪物越来越难打于是开始思考是不是自己平时锻炼没到位,于是苦练一个月后发现......自己连一个史莱姆 ...

  6. 【五一qbxt】day4 数论知识

    这些东西大部分之前都学过了啊qwq zhx大概也知道我们之前跟着他学过这些了qwq,所以: 先讲新的东西qwq:(意思就是先讲我们没有学过的东西) 进制转换 10=23+21=1010(2) =32+ ...

  7. 集训Day4

    在bzoj刷了好几天杂题感觉手感不是很好 继续回来集训一下 好几天没更新了啊... bzoj1875 一个无向图,一个人要从起始点走$t$步走到终点,不能沿着刚走过来那条边回去,问有多少种走法 $m ...

  8. 长乐国庆集训Day4

    T1 一道数论神题 题目 [题目描述] LYK有一张无向图G={V,E},这张无向图有n个点m条边组成.并且这是一张带权图,只有点权. LYK想把这个图删干净,它的方法是这样的.每次选择一个点,将它删 ...

  9. 2022寒假集训day4

    day4(day5补完的) 继续刷搜索方面的题, 初步了解了序列. T1 迷宫问题 题目描述设有一个 n*n 方格的迷宫,入口和出口分别在左上角和右上角.迷宫格子中分别放 0 和 1 ,0 表示可通, ...

  10. 2016HUAS_ACM暑假集训4F - 数论

    这个题目,如果没找到方向,确实有点一头雾水.但是如果你找对方向了,AC是分分钟的事.答案就是看n和m是否有除1之外的公约数. 简单证明:设n和m最大公约数不是1,假设为p.n和m总可以化为一个数乘以k ...

随机推荐

  1. PostgreSQL 性能优化: 执行计划

    查询计划 扫描结点 顺序扫描 索引扫描 只用索引的扫描 位图堆扫描 位图索引扫描 公共表表达式的扫描 自定义扫描 外表扫描 函数结果扫描 子查询扫描 表样本扫描 行地址扫描 行集合扫描 工作表扫描 连 ...

  2. Android BottomNavigation底部导航栏使用

    原文地址: Android BottomNavigation底部导航栏使用 - Stars-One的杂货小窝 基本使用 本文侧重点记录一些特殊的样式设置,所以基本使用这里就简单概述一下,详细图文可以去 ...

  3. 手写call&apply&bind

    在这里对call,apply,bind函数进行简单的封装 封装主要思想:给对象一个临时函数来调用,调用完毕后删除该临时函数对应的属性 call函数封装 function pliCall(fn, obj ...

  4. 【SpringCloud】Ribbon

    Ribbon 负载均衡原理 order-service 发起 user-service 请求,被ribbon进行拦截; ribbon会向注册中心拉取user-service 相对应的服务; 注册中心返 ...

  5. 【小小Demo】微信公众号如何接入微信机器人

    微信对话开放平台文档 官方文档 平台简介 微信对话开放平台开放了微信在对话领域积累多年的的智能对话技术,开发者及非开发者可简单.快速地搭建智能对话机器人(智能客服), 并接入公众号.小程序等,为业务赋 ...

  6. 学习jQuery核心内容这一篇就够了

    jQuery 1. 介绍 jQuery是JavaScript的工具库,对原生JavaScript中的DOM操作.事件处理.数据处理等进行封装,提供更便捷的方法. 让我们用更少的代码完成我们的js操作 ...

  7. 懒人的百宝箱「GitHub 热点速览」

    本周 GitHub Trending 除了 lazydocker 之外,还有多个 lazy 项目上线,比如大家熟悉的 lazyvim,可见,这个世界对懒人还是很友好的.除此之外,主打一个密码免输入,绕 ...

  8. 关于NOI2010“超级钢琴”的反思

    [NOI2010] 超级钢琴 题目描述 小 Z 是一个小有名气的钢琴家,最近 C 博士送给了小 Z 一架超级钢琴,小 Z 希望能够用这架钢琴创作出世界上最美妙的音乐. 这架超级钢琴可以弹奏出 \(n\ ...

  9. 聊聊自然语言处理NLP

    概述 自然语言处理(NLP)的正式定义:是一个使用计算机科学.人工智能(AI)和形式语言学概念来分析自然语言的研究领域.不太正式的定义表明:它是一组工具,用于从自然语言源(如web页面和文本文档)获取 ...

  10. 结果过滤器—MVC项目中结果过滤器(Result Filter)使用

    一.什么是结果过滤器? 结果过滤器(ResultFilter),是对执行的Action结果进行处理的一种AOP思想,适用于任何需要直接环绕 View 或格式化处理的逻辑.结果过滤器可以替换或更改 Ac ...