noip考前抱佛脚 数论小总结

exCRT

  • 求解韩信点兵问题,常见的就是合并不同\(mod\)。
  • 先mo一发高神的板子
for(R i=2;i<=n;++i){
    ll Y1,Yi,lcm=Lcm(p[i],p[1]);
    exgcd(p[1],p[i],a[i]-a[1],Y1,Yi);
    add(a[1],mul(p[1],Y1,lcm),lcm),p[1]=lcm;
}
  • 思想是合并方程组,现在假设我们要求解的是:

    \[x-p_0*y_0=a_0\]\[x-p_i*y_i=a_i\]

  • \(x\)是实际的值,显然有:

    \[p_0*y_0-p_i*y_i=a_i-a_0\]

  • 是\(exgcd\)的形式,把\(y_0\)和\(y_i\)解出来。
  • 此时\[p_0*y_0 = a_i-a_0\ \ \ mod \ p_i\]
  • 所以让\(y_0\)对\(p_i\)取模,回代到\[x=p_0*y_0+a_0\]
  • 此时\(x\)是在\(mod\ p_i*p_0\)意义下,取模后便是新的\(a_0\)了。
  • 最后更新\(p_0\)
  • excrt就是把\(p_0*=p_i\)改成\(p_0=lcm(p_0,p_i)\)罢了。
  • 模板

BSGS

  • 拔山盖世?

  • \[y^x≡z\ mod\ p\]

  • 设\(x=i*m-j\),其中\(m=\sqrt p+1\)则

    \[y^j*z≡y^{i*m}\]

  • 枚举\(j\),把对应的\(y^j*z\)放在\(hash\)表里。或者也可以用\(map\)
  • 注意这个时候的\(j\)要取最大值,从小往大枚举直接附值即可。
  • 枚举\(i\),查对应的\(y^{i*m}\),如果有值,答案就是\(i*m-j\)了。
  • 复杂度\(O(\sqrt p)\)
  • 注意前提条件\(gcd(y, p) = 1\)
  • 如果\(y\ mod\ p==0\),则无解。
  • \(upd\ on\ 11.7\)
  • 首先有个模板题P4454 [CQOI2018]破解D-H协议
  • 注意到

    \[y^j*z≡y^{i*m}\]

  • 这个东西中\(i*m-j\ge 0\)恒成立,所以在预处理时要\(j\)要从\(0\)开始到\(m\),但是查表的时候\(i\)要从\(1\)开始到\(m\)。

    同余最短路

  • 用一些数去拼凑出给定的数。
  • 以最小值建立剩余系,令\(f_i\)表示在拼凑出长度\(mod\)最小值为\(i\)的最小花费。
  • 显然每一个\(f_i\)都是这个剩余系中的最小值,且相互独立。
  • 连边后做最短路即可。
  • 不能拼凑出的最大值即位\(max(f_i-w_0)\),\(w_0\)是剩余系模数。
  • [x] HDU 6071 Lazy Running
  • 给出四个点1,2,3,4,1和2,2和3,3和4,4和1之间有路相连,现在从2点出发,最后回到2点,要求路径大于等于\(K\),问路径长度最短是多少,\(K\leq 10^{18},d\leq 3*10^4\)。
  • 同余最短路套路了,取一条与\(2\)相连的权值最小的边\(w\)。
  • 若存在一条从起点到终点的长度为k的路径,那么必然存在一条长度为\(k+2w\)的路径。
  • 即只要一开始在那条边上往返走就好了。
  • 设\(d_{i,j}\)表示从起点到\(i\),路径长度模\(2w\)为\(j\)时,路径长度的最小值。
  • 然后\(dij\)预处理\(d\),最后枚举所有剩余系,如果大于等于\(K\)就恰好更新答案,否则补上剩下除以\(2*w\)向上取整数。

    exgcd

  • 求解\(a*x+b*y=c\)的最小特解。
  • 注意在某些题目中要判断是否有解(裴蜀定理)。
  • 设\(f=gcd(a,b,c)\),有一些题目中\(x=0\)要还原成\(b\),但是此时应该要还原成\(\frac {b}{gcd}\),这样才能保证最小正整解。

    卢卡斯定理

  • 处理计算组合时取模数特别小的时候,往往小于\(n,m\)。
  • 对于质数而言,

    \[C_n^m=C_{n\ mod\ p}^{m\ mod\ p }*C_{n/p}^{m/p }\]

    裴蜀定理

  • \(a*x+b*y=c\)成立的充要条件是\(gcd(a,b)|c\).

    组合计数

  • 这不是计数里面的东西吗咕咕。

    线性筛逆元

  • 假设现在要求\(inv_i\),那么
  • 有\(x*i+j=p\),此时\(j=p\ mod\ i\),\(x=\frac {p}{i}\)
  • 在\(p\)剩余系下,那么\(inv_i=-1*x*inv_j\)
  • 所以\(inv(i)=-inv(p\ mod\ i)*(p/i)\)

    三分法

  • 咕咕。

    高斯消元

  • 我采用的是高斯约旦消元法。
  • 先找到系数最大的点提到当前行,然后消为\(1\),在把其他所有行的这一列消为\(0\)。
  • 这样就省去了回带的过程。
  • 无解情况:所有系数全为0但是值不为0
  • 不唯一解情况:所有系数全为0值也为0
  • 注意要先判断无解再判断解不唯一。

原文地址:https://www.cnblogs.com/Tyher/p/9926381.html

时间: 2024-10-29 21:32:24

noip考前抱佛脚 数论小总结的相关文章

NOIP考纲总结+NOIP考前经验谈

NOIP考纲总结+NOIP考前经验谈 首先来一张图,很直观(截止到2012年数据) 下面是收集的一些,我改了一下 红色加粗表示特别重要,必须掌握 绿色加粗表示最好掌握,可能性不是很大,但是某些可以提高程序效率 高精度 a.加法 b.减法 c.乘法(应该只会有高精乘单精) d.高精度除单精                 (后面c,d考的可能性较小,应该只考a,b) 排序算法 a.选择排序 b.插入排序 c.hash排序 d.归并排序(单纯的排序可能用不到,有快排就行了,但是归并排序的思想很重要)

Noip前的大抱佛脚----数论

数论 知识点 Exgcd \(O(logn)\)求解\(Ax+By=C\)的问题 1.若\(C\%gcd(A,B)!=0\)则无解 2.\(Gcd=gcd(A,B);A/=Gcd,B/=Gcd,C/=Gcd\) 3.代入下面代码求\(Ax+By=1\) 4.\(x*C\),得到一组特解 5.通解为\(\begin{cases}x=x_0+k*B \\y=y_0+k*A\end{cases}\) void Exgcd(ll a,ll b,ll &x,ll &y) { if(!b){x=1;y

NOIP 考前 数论复习

POJ 2891 x=r1 (mod a1) x=r2 (mod a2) x=a1*x+r1,x=a2*y+r2; a1*x-a2*y=r2-r1; 用Extend_Gcd求出m1*x+m2*y=d; d=Gcd(x,y); 那么就可以解出原来的x=(x*(r2-r1)/d) 那么代入原式r1=a1*x+r1 新的a1=lcm(a1,a2); 1 #include <cstdio> 2 #define LL long long 3 LL a1,a2,r1,r2,x,y,n; 4 LL Exte

【NOIP考前模拟赛】纯数学方法推导——旅行者问题

一.写在前面 这题似乎是一道原创题目(不是博主原创),所以并不能在任何OJ上评测,博主在网盘上上传了数据(网盘地址:http://pan.baidu.com/s/1mibdMXi),诸位看官需者自取.另外博主使用此题并没有获得出题人授权,如果出题人看到这篇blog并认为在下侵犯了您的权利,请用站内消息与在下联系,在下会立即删除这篇blog,给您带来的困扰之处敬请谅解. 博主上传这道题主要是因为这题牵扯许多数学运算,推导过程比较复杂,但是却没有用到任何算法或者数学定理,可以说这是一道想法题的典范.

【学习整理】NOIP涉及的数论 [updating]

扩展欧几里得 求二元一次不定式方程 的一组解. int exgcd(int a,int b,int &x,int &y) { int t; if(!b) {x=1;y=0;return a;} t=exgcd(b,a%b,y,x); y-=(a/b)*x; return t; } 线性筛质数 维护一个质数表.对于每个数 , 从小到大枚举所有质数 ,将 打上标记. 如果 , 停止枚举. void getprime() { int i,j; for(i=2;i<=n;i++) { if(

BZOJ4635 : 数论小测验

第一问: 设$a[i]$表示使用$[1,i]$的数字$n$次形成的数组里有多少个$\gcd=1$. 考虑容斥,则$a[i]=i^n-\sum_{j=2}^i a[\lfloor\frac{i}{j}\rfloor]$,可以分$\sqrt{i}$段算出. $ans=\sum_{i=l}^r a[\lfloor\frac{m}{i}\rfloor]$,也可以分$\sqrt{m}$段算出. 注意到只有$\sqrt{m}$个$a[i]$被使用到,所以只计算它们即可. 时间复杂度$O(m)$. 第二问:

【NOIP模拟赛】小奇挖矿 2

[题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿石交易市场,以便为飞船升级无限非概率引擎. [问题描述] 现在有m+1个星球,从左到右标号为0到m,小奇最初在0号星球. 有n处矿体,第i处矿体有ai单位原矿,在第bi个星球上. 由于飞船使用的是老式的跳跃引擎,每次它只能从第x号星球移动到第x+4号星球或x+7号星球.每到一个星球,小奇会采走该星球上所有的原矿,求小奇能采到的最大原矿数量. 注意,小奇不必最终到达m号星球. [输入格式] 第一行2个整数n,m

NOIP考前临时抱佛脚(算是考前日记吧)

谨以此祭奠我即将爆炸的NOIP2017. $Mingqi\_H\ \ 2017.09.24$ Day -47 突然发现半年来自己从来没有写对过SPFA,最近几天才发现自己的板子一直是错的...赶紧找个例题修一下板子: 1 #include<cstring> 2 #include<cstdio> 3 #include<queue> 4 using namespace std; 5 const int maxn = 1e6+10; 6 struct Edge{ 7 int

【NOIP模拟题】小象涂色(概率+期望+递推)

表示数学是个渣... 其实只需要推出每个箱子k次以后的颜色为i的概率就能算出期望了.. 对于区间[l, r]的箱子因为是任意颜色且任意取,所以概率分别为1/c和1/2,那么整体概率就为这两个的乘积.根据全概率公式,对于后边的状态我们可以累加和就行了.. 求出概率后期望就是颜色编号*概率....... 暴力40分..O(k*n*c^2)... #include <cstdio> #include <cstring> #include <cmath> #include &l