72超时求调
查看原帖
72超时求调
255162
封禁用户楼主2024/7/16 10:19
#include<bits/stdc++.h>
using namespace std;
long long  a[100005],m[100005];
long long n,M,c,q,p,ans,t,x,y;__int128 gcd;
inline  long long exgcd(long long a, long long b, long long &x, long long &y) {
  if (!b) {
    x = 1;
    y = 0;
    return a;
  }
  long long d = exgcd(b, a % b, x, y);
  long long t = x;
  x = y;
  y = t - (a / b) * y;
  return d;
}
long long mul(long long a,long long b,long long p) {
	long long ans=0,x=a;
	while(b!=0) {
		if(b&1) {
			ans=(ans+x)%p;
		}
		x=(x+x)%p;
		b>>=1;
	}
	return (ans%p+p)%p;
}
int read() {
	int x = 0, w = 1;
	char ch = 0;
	while (ch < '0' || ch > '9') {
		if (ch == '-') w = -1;
		ch = getchar();
	}
	while (ch >= '0' && ch <= '9') {
		x = x * 10 + (ch - '0');
		ch = getchar();
	}
	return x * w;
}
int main() {
	n=read();
	for(int i=1; i<=n; i++) {
		m[i]=read();
		a[i]=read();
	}
	M=m[1];
	ans=a[1];
	for(int i=2; i<=n; i++) {
		gcd=exgcd(M,m[i],x,y);
		long long o=a[i]-ans,N;
		t=m[i]/gcd;
		x=(x%t+t)%t;
		x=(mul(x,((o/gcd)%t+t)%t,t)+t)%t;
		N=M*t;
		ans=(ans+mul(x,M,N)+N)%N;
		M=N;
	}
printf("%lld",ans);

	return 0;
}

2024/7/16 10:19
加载中...