qbxt五一数学Day2
1. 判断素数(素性测试)
1. \(O(\sqrt n)\) 试除
bool isprime(int n)
{
if (n<2) return false;
for (int i=2;i*i<=n;i++)
if (!(n%i)) return false;
return true;
}
2. Miller-Rabin 素性测试
Theorm 1
若 \(n\) 是素数,则对于任意 \(1\le a\le n\),设 \(n-1=d\cdot 2^r\),则
\[a^d\equiv 1\pmod n\;,\;{\large \exists}_{0\le i\le r}\,a^{d\cdot 2^i}\equiv -1\pmod n
\]中至少有一个成立 .
随便找若干个数 \(a\) 进行判定,很大概率对(4~8 个在 long long
范围稳了)(取质数效果较好)
时间复杂度 \(O(k\log^2 n)\)
const int PrimeList[]={2,3,5,11,37,43,67,73,97}; // for Miller-Rabin
ll qmul(ll a,ll n,ll P)
{
ll ans=0; if (!n) return 0;
while (n)
{
if (n&1) ans=(ans+a)%P;
n>>=1; a=(a+a)%P;
} return ans%P;
}
ll qpow(ll a,ll n,ll P)
{
ll ans=1;
while (n)
{
if (n&1) ans=qmul(ans,a,P)%P;
n>>=1; a=qmul(a,a,P)%P;
} return ans;
}
bool miller_rabin(ll n,int a)
{
ll d=n-1,r=0;
while (!(d&1)){++r; d>>=1;}
ll x=qpow(a,d,n);
if (x==1) return true;
for (int i=0;i<r;i++)
{
if (x==n-1) return true;
x=qmul(x,x,n)%n;
} return false;
}
bool MillerRabin(ll n)
{
if (n<2) return false;
for (int i=0;i<9;i++)
{
if (n==PrimeList[i]) return true;
if (n%PrimeList[i]==0) return false;
if (!miller_rabin(n,PrimeList[i])) return false;
} return true;
}
* 欧拉函数
定义:
\(\varphi(n)\) 定义为 \(1\sim n\) 中与 \(n\) 互质的数的个数,即:
\[\varphi(n)=\sum_{i=1}^n[\gcd(i,n)=1]
\]
Theorm *
欧拉函数的求值公式:
\[\varphi(n)=n\left(1-\dfrac 1{p_1}\right)\left(1-\dfrac 1{p_2}\right)\cdots\left(1-\dfrac 1{p_r}\right)\mathrm{\,where\;} n=\prod_{i=1}^r p_i^{\alpha_i}
\]
Proof:容斥原理
\]
公式求 \(\varphi\) 值:
ll phi(ll n) // O(sqrt(n))
{
ll ans=n;
for (int i=2;i*i<=n;i++)
if (!(n%i))
{
ans=ans/i*(i-1);
while (!(n%i)) n/=i;
}
if (n>1) ans=ans/n*(n-1);
return ans;
}
Theorm *(欧拉函数是积性函数)
若 \(n,m\) 互质,则 \(\varphi(n)\varphi(m)=\varphi(nm)\) .
Proof:由求值式子显然得证 .
\]
2. 逆元
定义:
若 \(b\) 使得 \(ab\equiv 1\pmod m\),则 \(b\) 成为 \(a\) 模 \(m\) 意义下的逆元,记作 \(b=a^{-1}\) .
Theorm 2
逆元存在的充要条件是 \(\gcd(a,m)=1\) .
我们知道费马小定理和欧拉定理:
Theorm 3(费马小定理)
对于 \(\gcd(a,p)=1\) 且 \(p\) 为质数,有:
\[a^{p-1}\equiv 1\pmod p
\]
Theorm 4(欧拉定理)
对于 \(\gcd(a,p)=1\),有:
\[a^{\varphi(p)}\equiv 1\pmod p
\]其中 \(\varphi\) 是欧拉函数 .
素数求逆元:用费马小定理,答案是 \(a^{-1}=a^{p-2}\) .
其他:
- 用欧拉定理,答案是 \(a^{-1}=a^{\varphi(p)-1}\) .
- 用 exgcd,问题等价于求解 \(ax+by=p\) .
求 \(1\sim n\) 的逆元:
预处理阶乘,阶乘逆元可以
\]
求,\(n\) 的逆元可以
\]
求 .
3. exgcd(扩展欧几里得)
求解不定方程
\]
其中 \(x,y\) 是整数 .
Theorm 5(裴蜀定理 / 贝祖定理)
\[ax+by=c
\]有解当且仅当 \(\gcd(a,b)\mid c\) .
所以只需要处理 \(ax+by=\gcd(a,b)\) 的解即可 .
注意到 \(\gcd(a,b)=\gcd(b,a\bmod b)\),设 \(G=\gcd(a,b)\) .
我们按照欧几里德算法(即辗转相除法),当 \(b=0\) 时,容易发现 \(x=1,y=0\) .
若不然,如果我们知道
\]
的解,我们就可以依照如下方法求 \(ax+by=G\) 的解:
\]
int ex_gcd(int a,int b,int& x,int& y)
{
if (!b){x=1; y=0; return a;}
int xp,yp,g=ex_gcd(b,a%b,xp,yp);
x=yp; y=xp-yp*(a/b); return g;
return 0;
}
4. 离散对数(BSGS 算法求解)
BSGS:大步小步算法北上广深·百事公司·阿姆斯特朗算法
求解同余方程
\]
其中 \(p\) 是质数 .
由费马小定理,这个 \(x\) 不会超过 \(p-1\) .
分成如下数表:
如图,将所有行转换到第一行,用一个 set
或 hash
维护即可 .
ll BSGS(ll a,ll b,ll p) // a^x=b (mod p)
{
int s=sqrt(p),x=1; set<int> se;
for (int i=0;i<s;i++){se.insert(x); x=1ll*x*a%p;}
int y=qpow(qpow(a,s,p),p-2,p),z=b;
for (int i=1;;i++)
{
if (se.count(z))
{
z=qpow(a,(i-1)*s,p);
for (int j=(i-1)*s;;j++)
if (z==b) return j;
else z=1ll*z*a%p;
} z=1ll*z*y%p;
}
} // 要判无解只需要判断循环次数是否过多即可 .
5. CRT(中国剩余定理)
考虑合并两个方程,
\]
法一:大数翻倍法(zhx 的神仙解法)
枚举 \(b_1,b_1+p_1,b_1+2p_1,\cdots\) 判断是否成立
static pair<ll,ll> MergeEqu(ll a1,ll m1,ll a2,ll m2)
{
if (m2>m1) swap(m1,m2),swap(a1,a2);
while (a1%m2!=a2) a1+=m1;
return make_pair(a1,lcm(m1,m2));
}
法二:用扩展欧几里得解
令 \(x=k_1p_1+b_1=k_2p_2+b_2\),则
\]
则:
\]
用扩欧解出 \(k_1\) 即可 .
6. 线性筛(xxs)
1. 筛素数
碍事筛埃氏筛:
notprime[1]=true;
for (int i=2;i<=n;i++)
{
if (notprime[i]) continue;
for (int j=i+i;j<=n;j++) notprime[j]=true;
}
这是对于每个素数 \(i\) 枚举它的所有倍数筛掉
我们反过来,用每个数 \(i\) 枚举它的所有素数倍:
vector<int> plist; notprime[1]=true;
for (int i=2;i<=n;i++)
{
if (!notprime[i]) plist.push_back(i);
for (auto x:plist)
{
int now=i*x;
if (now>n) break;
notprime[x]=true;
}
} // C++11
/* 数组写法 */
notprime[1]=true;
for (int i=2;i<=n;i++)
{
if (!notprime[i]) plist[++pcnt]=i;
for (int j=1;j<=pcnt;j++)
{
int now=i*plist[j];
if (now>n) break;
notprime[plist[j]]=true;
}
}
注意到每个数可能被筛多次,例如:
\]
翻过来后就是枚举到 \(4,6\) 时,找到 \(2,3\) 筛掉 \(12\) .
我们希望每个数只被它的最小质因子筛掉 .
我们进行模拟:
当我们发现 \(4\) 时,枚举:
- 素数 \(2\):筛掉 \(8\) .
- 素数 \(3\):注意到 \(2\)(上一个素数)是 \(4\) 的倍数,所以后面的素数都不用枚举了,因为不是最小素因子(此处最小素因子至多是 \(2\))
用这种想法写出最终代码:
vector<int> plist; notprime[1]=true;
for (int i=2;i<=n;i++)
{
if (!notprime[i]) plist.push_back(i);
for (auto x:plist)
{
int now=i*x;
if (now>n) break;
notprime[x]=true;
if (!(i%x)) break;
}
}
2. 筛积性函数(\(\varphi\),\(\mu\))
当 \(k\) 是素数时:
\]
当第 \(10\) 行成立,显然 \(\mu(now)=0\) .
因为没有其他增加的素因子,由欧拉函数计算式得 \(\varphi(now)=x\cdot\varphi(x)\) .
如果互素(即第 \(11\) 行成立),由积性显然有 \(\varphi(now)=\varphi(x)\varphi(i)\),\(\mu(now)=\mu(x)\mu(i)\)
在板子上改一改就行辣
notprime[1]=true; phi[1]=mu[1]=1;
for (int i=2;i<=n;i++)
{
if (!notprime[i]){plist.push_back(i); phi[i]=i-1; mu[i]=-1;}
for (auto x:plist)
{
int now=i*x;
if (now>n) break;
notprime[now]=true;
if (!(i%x)){phi[now]=phi[i]*x; mu[now]=0; break;}
else{phi[now]=phi[i]*phi[x]; mu[now]=mu[i]*mu[x];}
}
}
7. 数论函数与狄利克雷卷积
1. \(\mu\)
1. 定义与性质
\(\mu\):莫比乌斯函数 ,数论容斥函数 .
定义:
对于整数 \(n\),定义:
\[\mu(n)=\begin{cases}1&n=1\\(-1)^r&{\large\forall}_{i\in[1,r]\cap \mathbb Z}:\alpha_i=1\\0&\rm otherwise.\end{cases}\mathrm{\,where\;} n=\prod_{i=1}^r p_i^{\alpha_i}
\]
Theorm:对于 \(n\perp m\),有 \(\mu(nm)=\mu(n)\mu(m)\)(\(\mu\) 是积性函数 .
Proof:
设
\]
其中 \({\large \forall}_{i\in[1,r]\cap \mathbb Z\,,\,j\in[1,t]\cap \mathbb Z}:p_i\neq q_j\)(即 \(n,m\) 互质).
当 \(\alpha_i=\beta_j=1\) 时(其余情况易证),
\]
2. 例题
问在 \(1\) 到 \(n\) 中有多少个数可以表示为
\[t=x^y
\]其中 \(x\ge 1,y\ge 2\) .
数据范围:\(n\le 10^{18}\)
对于对于一个 \(y\),存在 \(\sqrt[y]n\) 个 \(x\) 满足条件(显然有 \(y\le \log_2 (10^{18})\),即 \(y\le 64\)).
注意到有数会重复,e.g.
\]
答案即为:
\]
(这个 \(-1\) \(+1\) 是为了去掉 \(1=1^?\))
暴力求即可 .
2. 狄利克雷卷积
1. 定义
数论卷积(或狄利克雷(Dirichlet)卷积):
对于数论函数 \(f,g\),定义他们的狄利克雷卷积为:
\[(f*g)(n)=\sum_{d\mid n}f(d)g\left(\dfrac nd\right)
\]注:\(\sum\limits_{d\mid n}\) 是枚举因子 .
有性质:
- 交换律:\(f*g=g*f\) .
- 结合律:\((f*g)*h=f*(g*h)\)
- 分配律:\((f+g)*h=f*h+g*h\)
2. 特殊函数的狄利克雷卷积
一
\]
其中 \(I(n)=1\,,\,\varepsilon(n)=[n=1]\) .
即对于 \(n>1\),有:
\]
二
\]
其中 \(id(n)=n\) .
即:
\]
三
\]
Proof:
\]
3. 例题
求和变形技巧:
- 增加枚举变量
- 交换枚举顺序
- 删除无用变量
Problem 1
给定 \(n,m\),求:
\[\sum_{i=1}^n\sum_{j=1}^m\gcd(i,j)
\]
\]
(第三个等号是把 \(\gcd\) 转换成枚举倍数).
然后预处理 \(\varphi\),时间复杂度 \(O(n)\) .
Problem 2
给定 \(n\),问存在多少 \(1\le i,j\le n\),使得 \(i,j\) 互质 .
显然题目让求的是:
\]
和上一题几乎一样 [表情]
3. 莫比乌斯反演
\[g(n)=\sum_{d\mid n}f(d)\;\Leftrightarrow\;f(x)=\sum_{d\mid n}\mu(d)g\left(\dfrac nd\right)
\]即
\[g=f*I\;\Leftrightarrow\;f=\mu*g
\]
Proof:
\]
\]
8. 计数
1. 计数原理
1. 加法原理
一件事若干类(并列),方案数加起来
2. 乘法原理
一件事若干步(递进),方案数乘起来
2. 排列组合
定义
组合:\(n\) 中无序选 \(r\):
\]
排列:\(n\) 中有序选 \(r\):
\]
性质
\]
组合意义:选不选的
\]
组合意义:第一件选不选
\]
反复用前面那个式子
\]
组合意义:选两次
\]
组合意义:取数用乘法原理、组合数两种算法
\]
组合意义:建立奇数项与偶数项的一一对应,以达成消去的效果(第一项取反) .
\]
qwq
\]
(二项式定理)
组合意义:多项式乘法选数 .
几道小题
Problem 1
\(n\) 里选 \(k\) 数,数字可以相同,求方案数.
一个独特的解法:设选 \(a_1\le a_2\le \cdots\le a_k\) .
构造 \(g_1=a_1,g_2=a_2+1,g_3=a_3+2,\cdots\),然后对 \(g\) 作组合,得答案为
\]
Problem 2
\(n\) 里选 \(k\) 数,数字不能相邻,求方案数.
类似的设选 \(a_1< a_2< \cdots< a_k\) .
构造 \(g_1=a_1,g_2=a_2-1,g_3=a_3-2,\cdots\),然后对 \(g\) 作组合,得答案为
\]
Problem 3
计算
\[\sum_{k=1}^n \dbinom{n}{k}^2
\]
\]
第二个等号用组合意义:
qbxt五一数学Day2的更多相关文章
- 【qbxt五一】day2
简单数据结构 入门题: 在初学OI的时候,总会遇到这么一道题. 给出N次操作,每次加入一个数,或者询问当前所有数的最大值. 维护一个最大值Max,每次加入和最大值进行比较. 时间复杂度O(N). 给出 ...
- qbxt五一数学Day3
目录 1. 组合数取模 1. \(n,m\le 200\),\(p\) 任意 2. \(n,m\le 10^6\),\(p\ge 10^9\) 素数 3. \(n,m\le 10^6\),\(p\le ...
- qbxt五一数学Day1
目录 I. 基础知识 1. 带余除法(小学) 1. 定义 2. 性质 2. 最大公约数(gcd)/ 最小公倍数(lcm) 1. 定义 2. 性质 3. 高精度 II. 矩阵及其应用 1. 定义 2. ...
- Qbxt 模拟题 day2(am) T2 jian
[问题描述] 有N个数,随机选择一段区间,如果这段区间的所有数的平均值在[L,R]中则你比较厉害.求你比较厉害的概率. [输入格式] 第一行有三个数N, l, r,含义如上描述. 接下来一行有N个数代 ...
- Python小白的数学建模课-A3.12 个新冠疫情数模竞赛赛题与点评
新冠疫情深刻和全面地影响着社会和生活,已经成为数学建模竞赛的背景帝. 本文收集了与新冠疫情相关的的数学建模竞赛赛题,供大家参考,欢迎收藏关注. 『Python小白的数学建模课 @ Youcans』带你 ...
- noip2017 TG 游记
嗨小朋友们大家好,还记得我是谁吗?我就是为GG代言的蒟蒻--xzz 今天呐我特别的要向HN的dalao们ZJ的巨佬们还有全国的神犇们问声好 为什么呢因为我们在2017年11月份来到了吔屎的长沙理工大学 ...
- 【游记】CSp2020
同步发表于洛谷博客 初赛 Day -2 做了个模拟(非洛谷),只有一丁点分,显然过不了 (盗张 i am ak f 的图) Day 0 颓,颓,颓,又做了一套模拟,坚定了退役的信心. Day 1 人好 ...
- qbxt数学五一Day4
目录 1. 随机试验 2. 概率 1. 平凡 2. 条件概率 3. 期望 习题 1 2 3 4 1. 随机试验 定义: 不能预先确知结果 试验之前可以预测所有可能结果或范围 可以在相同条件下重复实验 ...
- 【五一qbxt】day7-2 选择客栈
停更20天祭qwq(因为去准备推荐生考试了一直在自习qwq) [noip2011选择客栈] 这道题的前置知识是DP,可以参考=>[五一qbxt]day3 动态规划 鬼知道我写的是什么emm 这道 ...
随机推荐
- maven install resources failed: newPosition < 0: (-1 < 0)
添加以下代码在 pom.xml 中,具体参阅这里 <build> <plugins> <plugin> <groupId>org.apache.mave ...
- unity---3D数学基础
点乘 A·B 判断敌人在前方还是后方 调试画线 画线段 前两个参数 分别是 起点 终点 画射线 前两个参数 分别是 起点 方向 Debug.DrawLine(this.transform.positi ...
- 记 iTextSharp 提取中文的问题
原文 问题 下面的代码中 currentText 能提取到大部分汉字 但是字体为 Non-Embedded Font: AdobeSongStd-Light(Horizontal) 的汉字提取不到 P ...
- 前端向后端传递formData类型的二进制文件
// 获取到的文件file类型转换为formData类型 let formData = new FormData(); formData.append("file", file文件 ...
- JOISC2020 题解
Day1T1 建筑装饰4 题目链接:Day1T1 建筑装饰4 Solution 我们先考虑朴素的\(dp\)方法: 设\(dp_{i,j,k}\)表示前\(i\)个数中,选了\(j\)个\(B\)数组 ...
- 【转载】解决k8s中的长连接负载均衡问题
原文链接:一流铲屎官二流程序员[解决k8s中的长连接负载均衡问题] 长连接与短连接: 简介 长连接是指在一个TCP连接上可以连续发送多个数据包,在TCP连接保持期间,如果没有数据包发送,需要双方发检测 ...
- 修改SQL Server用户的密码-使用SSMS
更新日志 2022年6月13日 发布文章. 2022年5月21日 开始文章. 打开软件Microsoft SQL Server Management Studio(简写:SSMS). 登录连接具体的数 ...
- 【.NET 6】多线程的几种打开方式和代码演示
前言: 多线程无处不在,平常的开发过程中,应该算是最常用的基础技术之一了.以下通过Thread.ThreadPool.再到Task.Parallel.线程锁.线程取消等方面,一步步进行演示多线程的一些 ...
- 使用React.js写一个类似单选框与复选框的功能
单选框 <!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <tit ...
- SAP APO-供需匹配
供需匹配包含主要功能"匹配能力"(CTM)和一个用于分配库存的附加功能. 在高级计划和优化中,SDM组件为这些应用程序提供跨工厂供应策略- 生产计划和详细计划(PP / DS) 供 ...