一次同余式的求解(扩展欧几里得)

来源:互联网 发布:java中多态的表现形式 编辑:程序博客网 时间:2024/05/17 16:13

大佬的解释
题目链接
一次同余式a*x%n=b的解的存在条件是b整除gcd(a,n)。

#include<cstdio>#include<cstring>#include<cmath>#include<queue>#include<iostream>#include<algorithm>#define LL long longusing namespace std;const int maxn=4e6+10;const int inf=0x3f3f3f3f;void exgcd(LL a,LL b,LL &x,LL &y)//一次同余式的求解{    if(!b)    {        x=1;        y=0;        return ;    }    exgcd(b,a%b,y,x);    y-=a/b*x;}int main(){    LL a,b,c,d,e;    while(~scanf("%lld%lld%lld%lld%lld",&a,&b,&c,&d,&e))    {        LL x=d-c,n=e,y=a-b;        LL z=__gcd(x,n);        if(y%z)//解存在的条件            printf("Impossible\n");        else        {            x/=z,y/=z,n/=z;            LL p,q;            exgcd(x,n,p,q);//(x*p和y同余于n)            p*=y;            p%=n;            while(p<0)                p+=n;            printf("%lld\n",p);//p为最小满足的解        }    }}
0 0
原创粉丝点击