首页 > 学院 > 开发设计 > 正文

拓展欧几里得

2019-11-11 05:21:36
字体:
来源:转载
供稿:网友

辗转相除法

int gcd(int a, int b){ return a == 0 ? b : gcd(b % a, a); }

拓展欧几里得算法

ll exgcd(ll a, ll b){ if(b == 0) { x = 1, y = 0; return a; } else { ll ans = exgcd(b, a%b); ll tmp = x; x = y; y = tmp - (a / b) * x; return ans; }}

例题:同余方程 Mod

Noip2012提高组复赛Day2T1

描述

求关于x的同余方程ax ≡ 1 (mod b)的最小正整数解。


格式

输入格式 输入只有一行,包含两个正整数a, b,用一个空格隔开。 输出格式 输出只有一行,包含一个正整数x0,即最小正整数解。输入数据保证一定有解。


样例1

样例输入1

3 10

样例输出1

7


超裸的题,直接上拓展欧几里得


#include<iostream>#include<cstdio>#include<cstring>#include<cmath>using namespace std;typedef long long ll;int x, y;ll exgcd(ll a, ll b){ if(b == 0) { x = 1, y = 0; return a; } else { ll ans = exgcd(b, a%b); ll tmp = x; x = y; y = tmp - (a / b) * x; return ans; }}int main(){ ll a,b; cin>>a>>b; exgcd(a, b); x = (x + b) % b;//防止出现负数 cout<<x; return 0;}
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表