zoukankan      html  css  js  c++  java
  • 同余方程

    原题链接:https://www.luogu.org/problem/show?pid=1082#sub

    此题乃exgcd的模板题,当然也可以用费马小定理做(赤裸裸的逆元啊)

    还记得exgcd是啥吗?扩展欧几里得算法,用来求解形似ax+by = gcd(a,b)一类方程的解。

    那和这个题有什么关系啊?这个题要求关于 x 的同余方程 ax ≡ 1 (mod b)的最小正整数解,我们把这个式子展开看一下。

    由同余式的意义,可以得知ax % b=1, 1%b =1,可以转化成方程ax+by=1,然后要求这个方程的一组解。

    很显然,这个方程代表的是一条直线,满足这个方程的解对应的点都在这条直线上,即有无数个解,我们要找的是最小的正整数解x。

    (y到底是多少没必要去关心,我们求的是x,这样等价正好满足扩欧)

    同时,这个方程在gcd(a,b)!=1时无解,不过没关系啦,本题保证一定有解。

    我们用扩欧求出的解并不一定是最小解,所以输出的时候要对b取模。

    负数解怎么办?先加一个b,再对b取模,搞定。

    参考代码:

     1 #include <iostream>
     2 using namespace std;
     3 long long int a,b,x,y;
     4 void exgcd(long long int a,long long int b,long long int &x,long long int &y){
     5     if (!b){
     6         x = 1;
     7         y = 0;
     8     }
     9     else{
    10         exgcd(b,a%b,y,x);
    11         y -= (a/b) * x;
    12     }
    13 }
    14 int main(){
    15     cin >> a >> b;
    16     exgcd(a,b,x,y);
    17     cout << (x+b) % b << endl;
    18     return 0;
    19 }
  • 相关阅读:
    jsp4个作用域
    jsp9个内置对象
    jsp指令
    jsp注释
    jsp原理
    java面试
    代理
    泛型
    exception
    基础
  • 原文地址:https://www.cnblogs.com/OIerShawnZhou/p/7496867.html
Copyright © 2011-2022 走看看