约数,gcd,exgcd.】的更多相关文章

很多题都是要求出什么最大公约数或者最小公倍数什么的,也有一些题目是和约数个数有关的,所以需要总结一下. 首先最大公约数和最小公倍数怎么求呢? 当然是观察法了,对于一些很聪明的孩纸他们一般随便一看就秒出答案,当然更聪明的孩纸知道最小公倍数并不容易求出. 所以需要先看出最大公约数,然后两数乘积/他们的最大公约数就是最小公倍数了. 我?我当然是上述方法求了.那样很快的.当然对于一些比较复杂的就要采取一些方法了. 如短除法,这样的方法实现很快的. 当求最大公约数的时候把列出的一个集合中的数字公共的约数全…
Preface 对于许多数论问题,都需要涉及到Gcd,求解Gcd,常常使用欧几里得算法,以前也只是背下来,没有真正了解并证明过. 对于许多求解问题,可以列出贝祖方程:ax+by=Gcd(a,b),用Exgcd解之即可到答案,Exgcd即扩展欧几里得算法.他还能求乘法逆元,同余方程通解.没有你想得到的,只有你做不到的. 这里是对于两个算法的学习小记 Content 欧几里得算法 算法介绍 由百度百科得 欧几里德算法又称辗转相除法,用于计算两个正整数a,b的最大公约数. 从整数的除法可知:对任给二整…
gcd就是求a和b最大公约数,一般方法就是递推.不多说,上代码. 一.迭代法 int gcd(int m, int n) { ) { int c = n % m; n = m; m = c; } return n; } 二.递归法 int Gcd(int a, int b) { ) return a; return Gcd(b, a % b); } 但exgcd是个什么玩意??? 百度了一下,百科这么讲的: 对于不完全为 0 的非负整数 a,b,gcd(a,b)表示 a,b 的最大公约数,必然…
ios_base::sync_with_stdio(); cin.tie(); ], nxt[MAXM << ], Head[MAXN], ed = ; inline void addedge(int u, int v) { to[++ed] = v; nxt[ed] = Head[u]; Head[u] = ed; } #include<iostream> #include<cstdio> #include<cstdlib> #include<cst…
我恨数论 因为打这篇的时候以为a|b是a是b的倍数,但是懒得改了,索性定义 a|b 为 a是b的倍数 咳咳,那么进入正题,如何证明gcd,也就是 gcd(a,b) = gcd(b,a%b)? 首先,设 p = a/b,c = a mod b 则a = p*b + c m = gcd(a,b),n = gcd(b,c) 因为m = gcd(a,b),所以 a | m 且 b | m 因为 b | m 所以 b * p | m                //  a|b,则a*k|b (k为整数)…
目录 欧几里德算法与扩展欧几里德算法 1.欧几里德算法 2.扩展欧几里德算法 欧几里德算法与扩展欧几里德算法 1.欧几里德算法 #include<bits/stdc++.h> using namespace std; int gcd(int a,int b) { if(b==0) return a; else return gcd(b,a%b); } //return b == 0 ? a : gcd(b, a % b); int main() { int m,n; while(cin>…
欧几里得算法: \[gcd(a,b)=gcd(b,a\bmod b)\] 证明: 显然(大雾) 扩展欧几里得及证明: 为解决一个形如 \[ax+by=c\] 的方程. 根据裴蜀定理,当且仅当 \[gcd(a,b)|c\] 时方程有解. 然后解这个方程... 我觉得大概就是: 我们设 \[ax_1+by_1=gcd(a,b)\] \[bx_2+(a\bmod b) y_2=gcd(b,a\bmod b)\] 根据欧几里得以及\(a\bmod b=a-\lfloor a/b\rfloor\)有 \[…
gcd(a, b),就是求a和b的最大公约数 lcm(a, b),就是求a和b的最小公倍数 然后有个公式 a*b = gcd * lcm     ( gcd就是gcd(a, b), ( •̀∀•́ ) 简写你懂吗) 解释(不想看就跳过){ 首先,求一个gcd,然后... a / gcd 和 b / gcd 这两个数互质了,也就是 gcd(   a / gcd ,b / gcd  )  =  1,然后... lcm = gcd *  (a / gcd) * (b / gcd) lcm = (a *…
数论入门2 另一种类型的数论... GCD,LCM 定义\(gcd(a,b)\)为a和b的最大公约数,\(lcm(a,b)\)为a和b的最小公倍数,则有: 将a和b分解质因数为\(a=p1^{a1}p2^{a2}p3^{a3}...pn^{an},b=p1^{b1}p2^{b2}p3^{b3}...pn^{bn}\),那么\(gcd(a,b)=\prod_{i=1}^{n}pi^{min(ai,bi)},lcm(a,b)=\prod_{i=1}^{n}pi^{max(ai,bi)}\)(0和任何…
求:$a^{bx \%p}\equiv 1(\mod p)$ 的一个可行的 $x$. 根据欧拉定理,我们知道 $a^{\phi(p)}\equiv 1(\mod p)$ 而在 $a^x\equiv 1(\mod p)$ 这个式子中 $x$ 是存在很多个解的. 这些解之间存在着循环节,使得任意解 $x$ 可以被表示成循环节的倍数. 我们设这个循环节为 $cir$. 由于已知 $\phi(p)$ 一定是一个可行解,所以最小循环节一定是 $\phi(p)$ 的约数. 然后我们就可以对 $\phi(p)…
exgcd入门以及同余基础 gcd,欧几里得的智慧结晶,信息竞赛的重要算法,数论的...(编不下去了 讲exgcd之前,我们先普及一下同余的性质: 若,那么 若,,且p1,p2互质, 有了这三个式子,就不用怕在计算时溢出了. 下面我会用与分别表示a与b的最大公约数与最小公倍数. 首先会来学扩欧的同学肯定都会欧几里得算法(即辗转相除法)了吧 而通过观察发现:,先除后乘防溢出. 所以与的代码如下: inline int gcd(int a,int b) {)?a:gcd(b,a%b);} inlin…
Billiard 枚举终点, 对于每一个终点一共有四种周期的相遇方式, 枚举一下取最小的时间. #include<bits/stdc++.h> #define LL long long #define LD long double #define fi first #define se second #define mk make_pair #define PLL pair<LL, LL> #define PLI pair<LL, int> #define PII pa…
题意 LOJ #2721. 「NOI2018」屠龙勇士 题解 首先假设每条龙都可以打死,每次拿到的剑攻击力为 \(ATK\) . 这个需要支持每次插入一个数,查找比一个 \(\le\) 数最大的数(或者找到 \(>\) 一个数的最小数),删除一个数. 这个东西显然是可以用 std :: multiset<long long> 来处理的(手写权值线段树或者平衡树也行). 对于每一条龙我们只能刚好一次秒杀,并且要恰好算血量最后为 \(0\)(一波带走). 然后就转化成求很多个方程: \[ \…
首先我们能注意到两个数x, y (0 < x , y < m) 乘以倍数互相可达当且仅当gcd(x, m) == gcd(y, m) 然后我们可以发现我们让gcd(x, m)从1开始出发走向它的倍数一个一个往里加元素就好啦, 往那边走 这个可以用dp求出来, dp[ i ] 表示 gcd(x, m)从 i 开始最大元素一共有多少个, dp[ i ] = max( dp[ j ] ) + cnt[ i ]   且 i | j 然后用扩展欧几里德求出走到下一步需要乘多少. #include<…
Description Input 第1行为一个整数N(1<=N<=15),即野人的数目. 第2行到第N+1每行为三个整数Ci, Pi, Li表示每个野人所住的初始洞穴编号,每年走过的洞穴数及寿命值. (1<=Ci,Pi<=100, 0<=Li<=10^6 ) Output 仅包含一个数M,即最少可能的山洞数.输入数据保证有解,且M不大于10^6. Sample Input 3 1 3 4 2 7 3 3 2 1 Sample Output 6 //该样例对应于题目描述…
题意:求\((n-m)t+Lk=x-y\)的解\(t\) #include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<string> #include<vector> #include<stack> #include<qu…
智障了,智障了,水一水博客. 本来是个水题,但是for循环遍历那里写挫了... One Person Game Time Limit: 2 Seconds      Memory Limit: 65536 KB There is an interesting and simple one person game. Suppose there is a number axis under your feet. You are at point A at first and your aim is…
题目大意:略 真是一波三折的一道国赛题,先学了中国剩余定理,勉强看懂了模板然后写的这道题 把取出的宝剑攻击力设为T,可得Ti*x=ai(mod pi),这显然是ax=c(mod b)的形式 这部分用exgcd求解x的最小正整数解 先把a,b,c除以gcd(a,b),如果c不能整除gcd(a,b)那么无解.此时a,b互质,用exgcd求得a的逆元,逆元乘回来gcd(a,b)就是x的最小正整数解,注意可能爆long long要用龟速乘 那么此时求得的x是仅仅对于这一个方程的,我们要把它带到excrt…
题意:id=2242">链接 方法: BSGS+高速幂+EXGCD 解析: BSGS- 题解同上.. 代码: #include <cmath> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define MOD 140345 using namespace std; typedef long long ll; ll t,…
挺简单的,正好能再复习一遍 $exgcd$~ 按照题意一遍一遍模拟即可,注意一下 $pollard-rho$ 中的细节. #include <ctime> #include <cmath> #include <cstdio> #include <algorithm> #define ll long long #define ull unsigned long long #define setIO(s) freopen(s".in",&qu…
推出来了一个解法,但是感觉复杂度十分玄学,没想到秒过~ Code: #include <bits/stdc++.h> #define ll long long #define N 50000 #define setIO(s) freopen(s".in","r",stdin) using namespace std; namespace Math { ll pp,answer; ll exgcd(ll a,ll b,ll &x,ll &y…
考试的时候推出来了,但是忘了 $exgcd$ 咋求,成功爆蛋~ 这里给出一个求最小正整数解的模板: ll solve(ll A,ll B,ll C) { ll x,y,g,b,ans; gcd = exgcd(A,B,x,y); if(C%gcd!=0) return -1; x*=C/gcd,B/=gcd; if(B<0) B=-B; ans=x%B; if(ans<=0) ans+=B; return ans; } 大概就是这样. 说一下题: 可以将题目转化成求 $\frac{ans(an…
中国剩余定理,又叫孙子定理. 作为一个梗广为流传.其实它的学名叫中国单身狗定理. 中国剩余定理 中国剩余定理是来干什么用的呢? 其实就是用来解同余方程组的.那么什么又是同余方程组呢. 顾名思义就是n个同余方程. 形如 如果只有一个方程的话那么是很容易用exgcd来解决. 但如果变成n个就需要用到CRT了. 下面我们言归正传. 首先我们要知道只有满足m1,m2,mn两两互质才能运用CRT. 首先,我们令M=Πni=1. 令Mi=M/mi,这样我们就可以满足Mi%mk=0(k!=i). 然后我们在构…
1.解同余方程: 同余方程可以转化为不定方程,其实就是,这样的问题一般用拓展欧几里德算法求解. LL exgcd(LL a,LL b,LL &x,LL &y){ if(!b){ x=;y=; return a; } LL gcd=exgcd(b,a%b,x,y); LL t=x; x=y; y=t-a/b*x; return gcd; } 2.解同余方程组(任意两个模意义互质)用CRT. LL CRT(){ LL ans=,M=,x,y; ;i<=n;i++) M*=m[i]; ;i…
有必要重新学一下扩展GCD emmmm. 主要是扩展GCD求解线性同余方程$ax≡b (mod p)$. 1.方程有解的充分必要条件:b%gcd(a,p)=0. 证明: $ax-py=b$ 由于求解整数解,ax是gcd(a,p)的整数倍,py也是,所以b是gcd(a,p)的整数倍. 2.扩展GCD模板 int exgcd(int a,int b,int &x,int &y) { if(b==0){x=1,y=0;return a;}//注意x,y的赋值. int gcd=exgcd(b,a…
int exgcd(int a,int b,int &x,int &y) { ) { x=,y=; return a; } int gcd=exgcd(b,a%b,x,y); int t=x; x=y; y=t-a/b*y; return gcd; } int China(int W[],int B[],int k) { ,m,n=; ;i<=k;i++) n*=W[i]; ;i<=k;i++) { m=n/W[i]; exgcd(W[i],m,x,y); a=(a+y*m*B…
LINK:The red sakura 暴怒狂樱 血染京都. 这题质量不咋地 这题也没啥营养. 不过还是存在值得学习的地方的. 一个trick n行 m列 第一行与第n行相连 第1列和第m列相连的时候. 考虑一个有意思的事情 x+k,y+k 在gcd(n,m)==1的时候 x+k,y+k为整个网格的通项. 更普遍的 x+k,y+k所代表的集合 %gcd(n,m)为等价类. 那么容易发现 一共存在gcd(n,m)个等价类 每个等价类的大小为LCM(n,m); 考虑这道题 出题人的题解上说 可以证明…
LINK:值日班长值周班长 题目描述非常垃圾. 题意:一周5天 每周有一个值周班长 每天有一个值日班长 值日班长日换 值周班长周换. 共n个值日班长 m个值周班长 A是第p个值日班长 B是第q个值日班长 问 最早是哪一天 使得值日班长为A且值周班长为B. 显然是一个类似于方程组的题目 可以列出方程 设是第x天. \((x-p)\mod n=0\) \(\lceil\frac{x}{5}\rceil \mod m=q-1\) 整到一个方程里就是 x=ny+p. \(\lceil\frac{ny+p…
定义 扩展欧几里得算法是用来在已知一组 \((a,b)\) 的时,求解一组 \((x,y)\) 使得 \[ax+by=gcd(a,b) \] 思想 and 板子 根据相关的知识可以得到 \[gcd(a,b)=gcd(b,a \bmod \ b) \] 由当 \(b=0\) 是即可得出 \(x=1,y=0\) 即可递推求解 如何来做? \[ax+by=gcd(a,b)=gcd(b,a \bmod b) \] \[bx+(a \bmod\ b)y=gcd(b,a \bmod b) \] \[bx+(…