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

    洛谷1082 同余方程

    [a x equiv 1 pmod {b} ]

    根据同余式的定义,我们可以知道一个一次同余方程一定可以写成
    ax+by=c的不定方程形式
    简单证一下吧
    比如

    [a x equiv c pmod {b} ]

    我们引入一个变量k,根据mod运算的性质,我们可知该式一定可以写为:ax-kb=c的形式
    我们定义y=-k;所以该式就变为了:ax+by=c的形式。
    我们根据贝祖定理可知:给出两个数a,b,设d=gcd(a,b),则一定有ax+by=d。因为ax,by,一定是d的倍数,所以ax+by=c中的c也一定是d的倍数
    即然c是d 的倍数,那么一定有

    [c equiv 0 pmod d ]

    我们再回到题上去看
    本题中我们的c 是1那一定有1%gcd(a,b)=0;所以我们可以得出
    若同余方程有解,则gcd(a,b)=1
    接下来方程就转化为ax+by=d的形式
    我们要求出最小的x,扩欧跑一遍
    因为我们要求的是最小的X(所得到的x有可能为负或不为最小)我们对所得的x处理一下输出即可
    代码如下

    #include<iostream>
    #include<cstdio>
    using namespace std;
    long long x,y,a,b;
    void exgcd(long long a,long long b){
    	if(b==0){
    		x=1;
    		y=0;
    		return ;
    	}
    	exgcd(b,a%b);
    	long long tmp=x;
    	x=y;
    	y=tmp-a/b*y;
    }
    int main(){
    	cin>>a>>b;
    	exgcd(a,b);
    	x=(x%b+b)%b;
    	cout<<x; 
    	return 0;
    }
    

    结束
    我们求出的这个最小x也就是在mod该模数下的最小逆元

  • 相关阅读:
    Spring自动代理机制
    JUnit4 详解
    struts2 OGNL
    loj4j的配置跟使用
    junit浅学笔记二
    shell变量设置
    zookeeper使用
    [zz]Linux kernel map
    glog 使用中存在的问题
    shell中特殊字符(串)
  • 原文地址:https://www.cnblogs.com/rpup/p/13560460.html
Copyright © 2011-2022 走看看