[关闭]
@zhangche0526 2017-02-25T06:36:00.000000Z 字数 610 阅读 1016

辗转相除法

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

拓展欧几里得算法

  1. ll exgcd(ll a, ll b)
  2. {
  3. if(b == 0)
  4. {
  5. x = 1, y = 0;
  6. return a;
  7. }
  8. else
  9. {
  10. ll ans = exgcd(b, a%b);
  11. ll tmp = x;
  12. x = y;
  13. y = tmp - (a / b) * x;
  14. return ans;
  15. }
  16. }

例题:同余方程 Mod

--

Noip2012提高组复赛Day2T1

描述

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


格式

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


样例1

样例输入1

3 10

样例输出1

7


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


  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<cmath>
  5. using namespace std;
  6. typedef long long ll;
  7. int x, y;
  8. ll exgcd(ll a, ll b)
  9. {
  10. if(b == 0)
  11. {
  12. x = 1, y = 0;
  13. return a;
  14. }
  15. else
  16. {
  17. ll ans = exgcd(b, a%b);
  18. ll tmp = x;
  19. x = y;
  20. y = tmp - (a / b) * x;
  21. return ans;
  22. }
  23. }
  24. int main()
  25. {
  26. ll a,b;
  27. cin>>a>>b;
  28. exgcd(a, b);
  29. x = (x + b) % b;//防止出现负数
  30. cout<<x;
  31. return 0;
  32. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注