警示后人(龟速乘 TLE 20pts)
查看原帖
警示后人(龟速乘 TLE 20pts)
537627
_LSA_楼主2022/10/28 20:05
#include<bits/stdc++.h>
#define ll long long
using namespace std;

ll read(){
	char ch = getchar();
	while(!isdigit(ch) && ch != '-') ch = getchar();
	ll X = 0 , f = 1;
	if(ch == '-') f = -1 , ch = getchar();
	while(isdigit(ch)) X = (X<<1)+(X<<3)+ch-'0' , ch = getchar();
	return X*f;
}



ll exgcd(ll a,ll b,ll &x,ll &y){
	if(b == 0){
		x = 1;
		y = 0;
		return a;
	}
	ll d = exgcd(b,a%b,x,y);
	ll z = x; x = y; y = z-(a/b)*y;
	return d;
}

ll mul(ll a,ll b,ll M){
	ll ans = 0;
	while(b){
		if(b & 1)
			ans = (ans+a)%M;
		a = (a+a)%M;
		b >>= 1;
	}
	return ans;
}

const int N = 12;
ll k,n;
ll a[N] , b[N];
ll M = 1;

int main(){
	
	k = read();
	for(int i=1;i<=k;i++) a[i] = read();
	for(int i=1;i<=k;i++) b[i] = read();
	
	
	for(int i=1;i<=k;i++)
		M *= b[i];
	
	for(int i=1;i<=k;i++){
		ll m = M/b[i];
		ll x,y;
		exgcd(m,b[i],x,y);
		x = (x%M+M)%M;
		n = (n+mul(mul(a[i],m,M),x,M))%M;
	}
	
	cout << (n+M)%M;
	return 0;
}

其中aia_ixx可能是负的,龟速乘可能会死循环...... 所以

x = (x%M+M)%M;
mul(a[i],m,M)//a_i放前面
2022/10/28 20:05
加载中...