【codevs 1200】【NOIP 2012】同余方程 拓展欧几里德求乘法逆元模板题

模板,,,

#include<cstdio>
using namespace std;
void exgcd(long long a,long long b,long long &x,long long &y){
	if (b==0) {x=1; y=0;}
	else {exgcd(b,a%b,x,y); int t=y; y=x-a/b*y; x=t;}
}
int main(){
	long long a,b,x,y;
	scanf("%lld %lld\n",&a,&b);
	exgcd(a,b,x,y);
	printf("%lld\n",(x+b)%b);
	return 0;
}
时间: 2024-12-13 06:57:56

【codevs 1200】【NOIP 2012】同余方程 拓展欧几里德求乘法逆元模板题的相关文章

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

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; }

【poj 1061】青蛙的约会(数论--同余方程 拓展欧几里德)

题意:已知2只青蛙的起始位置 a,b 和跳跃一次的距离 m,n,现在它们沿着一条长度为 l 的纬线(圈)向相同方向跳跃.问它们何时能相遇?(好有聊的青蛙 (??????‵) *)永不相遇就输出"Impossible".(蠢得可怜 -_-!) 解法:用拓展欧几里德求同余方程的最小正整数解.(a+mx)-(b+nx)=k*l (k表示圈数) → (m-n)x=k*l+b-a → (m-n)x=b-a(mod l).当然其实=(b-a)%l 更准确,但反正都是模,也没有关系啦.于是就像上题一

求乘法逆元的几种方法

(数学渣,下面的文字可能有误,欢迎指教)乘法逆元的定义貌似是基于群给出的,比较简单地理解,可以说是倒数的概念的推广.记a的关于模p的逆元为a^-1,则a^-1满足aa^-1≡ 1(mod p) 加减乘与模运算的顺序交换不会影响结果,但是除法不行.有的题目要求结果mod一个大质数,如果原本的结果中有除法,比如除以a,那就可以乘以a的逆元替代. 在mod p的运算中,a存在乘法逆元当且仅当a与p互质.一般题目给的是一个大质数,所以只要a不是p的倍数,就以求乘法逆元. 目前了解到的求法有三种:1.扩展

hdu1576(扩展gcd求乘法逆元)

A/B Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 7509    Accepted Submission(s): 5969 Problem Description 要求(A/B)%9973,但由于A很大,我们只给出n(n=A%9973)(我们给定的A必能被B整除,且gcd(B,9973) = 1). Input 数据的第一行是一个T

hdu1115 Lifting the Stone(几何,求多边形重心模板题)

题意:就是给你一个多边行的点的坐标,求此多边形的重心. 一道求多边形重心的模板题! #include<cstdio> #include<cmath> #include<cstring> using namespace std; struct point { double x,y; }PP[1000047]; point bcenter(point pnt[],int n){ point p,s; double tp,area = 0, tpx=0, tpy=0; p.x

poj 3041Asteroids 二分匹配求最小点覆盖模板题

//最大匹配=最小覆盖 //这题是求最小覆盖点的模板题 #include<iostream> #include<cstdio> #include<cstring> using namespace std; const int maxn = 510; int line[maxn][maxn]; int match[maxn]; int vis[maxn]; int N , K; int find(int start) { for(int i = 1;i <=  N;

求乘法逆元

由于在计算除法时,mod 运算不能直接加在除数被除数后,因此需要将 n / a (mod b )转化为 n * x (mod b ),以便于进行模运算.求 x 的过程就称为求逆元. 对于 a .b (a 与 b 互素)满足 n / a ≡ n * x (mod b ),则称 x 为 a 模 b 的逆元: 一般有两种求逆元的方式:扩展欧几里得求逆元和欧拉-费马定理求逆元: 1.扩展欧几里得求逆元: 见(欧几里得与扩展欧几里得): http://www.cnblogs.com/cenariusxz/

poj 1144 Network【无向图求割顶模板题】

Description A Telephone Line Company (TLC) is establishing a new telephone cable network. They are connecting several places numbered by integers from 1 to N. No two places have the same number. The lines are bidirectional and always connect together

新学一个 求乘法逆元的方法。

inv[x] = ( Mod - Mod / x ) * inv[Mod%x] % Mod 设Mod=px+q.  inv[x]=r px+q = 0  (mod  Mod) pxr+qr = 0 (mod Mod) p + qr = 0 (mod Mod) r=-p/q= -p*inv[q] = -(Mod/x)*inv[Mod % x] = (Mod - Mod/x) * inv[Mod % x].