題目鏈接
拓展歐幾里得解線性同餘方程組
#include <iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<queue>
#include<cmath>
using namespace std;
typedef __int128 ll;
ll n,m;
const int maxn=1e5+10;
ll a[maxn],p[maxn];
void read(ll &ret){
char c;
while((c=getchar())&&(c>'9'||c<'0'));
ret=0;
while(c>='0'&&c<='9') ret=ret*10+c-'0', c=getchar();
}
void out(ll x){
if(x>9) out(x/10);
putchar(x%10+'0');
}
void exgcd(ll a,ll b,ll &d,ll &x,ll &y){
if(b==0){
x=1;
y=0;
d=a;
}
else{
exgcd(b,a%b,d,y,x);
y-=x*(a/b);
}
}
ll excrt(){
ll M=p[1];
ll ret=a[1];
for(int i=2;i<=n;i++){
ll c=(a[i]-ret%p[i]+p[i])%p[i];
ll x,y,g;
exgcd(M,p[i],g,x,y);
if(c%g!=0)
return -1; //無解
ll bg=p[i]/g;
x=(x%bg)*(c/g%bg)%bg;
x=(x+p[i])%bg;
ret+=x*M;
M*=bg;
}
return ret;
}
int main(){
read(n);read(m);
for(int i=1;i<=n;i++){
read(p[i]);read(a[i]);
}
ll ret = excrt();
if(ret==-1)
printf("he was definitely lying");
else if(ret>m)
printf("he was probably lying");
else
out(ret);
return 0;
}