大佬们求条excrt
查看原帖
大佬们求条excrt
865625
KobeBeanBryantCox楼主2024/7/17 14:11

模板题

#include<bits/stdc++.h>
#define Code using
#define by namespace
#define wjb std
Code by wjb;
#define int long long
int in()
{
	int k=0,f=1;
	char c=getchar();
	while(c<'0'||c>'9')
	{
		if(c=='-')f=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9')k=k*10+c-'0',c=getchar();
	return k*f;
}
void out(int x)
{
	if(x<0)putchar('-'),x=-x;
	if(x<10)putchar(x+'0');
	else out(x/10),putchar(x%10+'0');
}
const int N=1e5+10;
int a[N],m[N];
void exgcd(int a,int b,int &x,int &y)
{
	if(b==0)x=1,y=0;
	else exgcd(b,a%b,y,x),y-=a/b*x;
}
bool work1(int a,int b,int c,int &x,int &y)
{
	if(c%__gcd(a,b)!=0)return false;
	exgcd(a,b,x,y);
	x*=(c/__gcd(a,b)),y*=(c/__gcd(a,b));
	return true;
}
int lcm(int x,int y)
{
	return x/__gcd(x,y)*y;
}
int excrt(int n)
{
	int m1=m[1],m2,a1=a[1],a2,k1,k2,tx;
	for(int i=2;i<=n;i++)
	{
		a2=a[i],m2=m[i];
		if(!work1(m1,m2,a2-a1,k1,k2))return -1;
		int g=a2/__gcd(a1,a2);
		k1=(k1%g+g)%g;
		tx=k1*m1+a1;
		//cout<<k1<<"#";
		//cout<<tx<<" ";
		a1=tx,m1=lcm(m1,m2);
	}
	return tx;
}
signed main()
{
	int n=in();
	for(int i=1;i<=n;i++)m[i]=in(),a[i]=in();
	out(excrt(n));
    return 0;
}
2024/7/17 14:11
加载中...