模板 各种欧几里得

【模板】各种欧几里得

 1 //a > b
 2 int gcd(int a , int b)
 3 {
 4     return b ? gcd( b , a % b ) : a ;
 5 }
 6
 7 int lcm(int a , int b)
 8 {
 9     return a / gcd( a , b ) * b;
10 }
 1 int gcd(int n,int m)//n>m
 2 {
 3     //最大公约数
 4     int r;
 5     while(m)
 6     {
 7         r = n%m;
 8         n = m;
 9         m = r;
10     }
11     return n;
12 }
13
14 int kgcd(int a,int b)
15 {
16     if(!a) return b;
17     if(!b) return a;
18     if(!(a&1) && !(b&1))
19         return kgcd(a>>1,b>>1)<<1;
20     else if(!(b&1)) return kgcd(a,b>>1);
21     else if(!(a&1)) return kgcd(a>>1,b);
22     else return kgcd(abs(a-b),min(a,b));
23 }
24
25 //扩展欧几里得
26 //求方程ax+by+c = 0有多少整数解
27 int extgcd(int a,int b,int &x,int &y)
28 {
29     if(!b)
30     {
31         x=1;
32         y=0;
33         return a;
34     }
35     int d = extgcd(b,a%b,x,y);
36     int t = x;
37     x=y;
38     y=t-a/b*y;
39     return d;
40 }
时间: 2024-10-13 06:28:18

模板 各种欧几里得的相关文章

求乘法逆元模板(扩展欧几里得)

void exgcb(LL a,LL b,LL &d,LL &x,LL &y){ if(!b){d=a;x=1;y=0;return;} exgcb(b,a%b,d,y,x);y-=x*(a/b); } LL ny(LL a,LL b){ ///求a关于b的逆元(要求a,b互质) LL d,x,y; exgcb(a,b,d,x,y); return d==1?(x+b)%b:-1; }

扩张欧几里得模板

1 /************************************* 2 3 扩展欧几里得模板 4 给出ax+by=gcd(a,b)求gcd(a,b),x,y. 5 gcd(a,b)为a,b的最大公约数. 6 7 *************************************/ 8 9 #include<iostream> 10 using namespace std; 11 12 ///扩展gcd,可以求出gcd(a,b)以及ax+by=gcd(a,b)中x,y的值

扩展欧几里得模板(洛谷1082 同余方程NOIP 2012 提高组 第二天 第一题)

题目描述 求关于 x 的同余方程 ax ≡ 1 (mod b)的最小正整数解. 输入输出格式 输入格式: 输入只有一行,包含两个正整数 a, b,用一个空格隔开. 输出格式: 输出只有一行,包含一个正整数 x0,即最小正整数解.输入数据保证一定有解. 输入输出样例 输入样例#1: 3 10 输出样例#1: 7 说明 [数据范围] 对于 40%的数据,2 ≤b≤ 1,000: 对于 60%的数据,2 ≤b≤ 50,000,000: 对于 100%的数据,2 ≤a, b≤ 2,000,000,000

欧几里得(模板)

int gcd(int n,int m)//n>m { //最大公约数 int r; while(m) { r = n%m; n = m; m = r; } return n; } int kgcd(int a,int b) { if(!a) return b; if(!b) return a; if(!(a&1) && !(b&1)) return kgcd(a>>1,b>>1)<<1; else if(!(b&1)) r

拓展欧几里得模板

数论拓展欧几里得,计算mx+ny=d的一组解(m.n为已知) int xx=x+n/d*i; int yy=y-m/d*i;//xx,yy分别为其它通解 void extend_gcd(int a,int b,int &x,int &y,int &d) { if(!b) { x=1; y=0; d=a; return; } extend_gcd(b,a%b,x,y,d); int t=x-a/b*y; x=y; y=t; }

欧几里得,扩展欧几里得(模板)

1 int gcd(int a,int b) 2 { 3 return b?gcd(b,a%b):a;//最后返回的a为最大公约数 4 } 扩展欧几里得求逆元:51nod1256 1 #include <iostream> 2 #include <stdio.h> 3 #include <string.h> 4 using namespace std; 5 int d,x,y; 6 //ax+by=1(x为a的逆元,同理y为b的逆元) 7 void Exgcd(int

[模板]欧几里得算法/扩展欧几里得

最大公因数(欧几里得算法) $gcd(a,b)=gcd(b\%a,a)$(不一定需要a<b) $gcd(0,b)=b$ 1 inline int gcd(int a,int b){ 2 return a==0?b:gcd(b%a,a); 3 } 扩展欧几里得 寻找$ax+by=gcd(a,b)$的一组解x,y(一定存在整数解) $ax+by=gcd(a,b)=gcd(b\%a,a)=(b-\lfloor\frac{b}{a}\rfloor*a)x'+ay'$ 所以有一组解$x=y'-\lfloo

青蛙的约会 拓展欧几里得 +模板

题目描述 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要的事情,既没有问清楚对方的特征,也没有约定见面的具体位置.不过青蛙们都是很乐观的,它们觉得只要一直朝着某个方向跳下去,总能碰到对方的.但是除非这两只青蛙在同一时间跳到同一点上,不然是永远都不可能碰面的.为了帮助这两只乐观的青蛙,你被要求写一个程序来判断这两只青蛙是否能够碰面,会在什么时候碰面. 我们把这两只青蛙分别叫

POJ 1061 青蛙的约会 扩展欧几里得

扩展欧几里得模板套一下就A了,不过要注意刚好整除的时候,代码中有注释 #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; typedef long long ll; ll exgcd(ll a, ll b, ll&x, ll&y) { if (b ==