1. 程式人生 > >一次同餘式的求解(擴充套件歐幾里得)

一次同餘式的求解(擴充套件歐幾里得)

大佬的解釋
題目連結
一次同餘式a*x%n=b的解的存在條件是b整除gcd(a,n)。

#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#include<iostream>
#include<algorithm>
#define LL long long
using 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為最小滿足的解 } } }