求助:0分,我是小白,再搞不懂就要放弃了
查看原帖
求助:0分,我是小白,再搞不懂就要放弃了
285961
魏老师楼主2021/2/9 13:44
//扩展中国剩余定理 
#include<bits/stdc++.h>
using namespace std;
long long x,y,d;//d存储最大公约数 
long long b[100010],a[100010];
int n;
void gcd(long long a,long long b);//求不定方程ax+by=gcd(a,b)的根
int lcm(long long a,long long b); 
int main()
{
	cin>>n;
	cin>>a[1]>>b[1];
	for(int i=2;i<=n;i++)
	{
		cin>>a[i]>>b[i];
		gcd(a[i-1],a[i]);
		while(x<0) x+=(a[i]/d);
		long long t=x*(b[i]-b[i-1])/d;//t就是X0' 
		long long m=a[i-1]*t+b[i-1];//m就是x'
		b[i]=m;
		a[i]=lcm(a[i-1],a[i]);//新的同余方程 
	}
	//cout<<b[n]<<" "<<a[n]<<endl;
	cout<<b[n]+a[n]<<endl;
	return 0;
}
void gcd(long long a,long long b)
{
	if(b==0) {d=a;x=1;y=0;}
	else
	{
		gcd(b,a%b);
		long long t;
		t=x;x=y;y=t-(a/b)*y;
	} 
}

int lcm(long long a,long long b)
{
	gcd(a,b);
	return a*b/d;
}

2021/2/9 13:44
加载中...