一次同餘式的求解(擴充套件歐幾里得)
阿新 • • 發佈:2018-12-24
大佬的解釋
題目連結
一次同餘式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為最小滿足的解
}
}
}