求助,玄学TLE20分
查看原帖
求助,玄学TLE20分
113521
muyang_233楼主2020/11/29 22:37

RT,用龟速乘之前是正常的90,加了之后就T了8个点

#include <cstdio>
using namespace std;
#define ll long long
int n;
int a[15],b[15];
ll multi(ll a,ll b,ll mod){
	ll res=0;
	while(b){
		if (b&1){
			res=(res+a)%mod;
		}
		a=(a+a)%mod;
		b>>=1;
	}
	return res;
}
ll exgcd(ll a,ll b,ll &x,ll &y){
	if (b==0){
		x=1;
		y=0;
		return a;
	}
	ll r=exgcd(b,a%b,x,y);
	ll t=x;
	x=y;
	y=t-a/b*y;
	return r;
	
}
ll CRT(int a[],int m[],int n){
	ll M=1,ans=0;
	for (int i=1;i<=n;i++){
		M*=m[i];
	}
	for (int i=1;i<=n;i++){
		ll Mi=M/m[i],x,y;
		exgcd(Mi,m[i],x,y);
		ans=(ans+multi(multi(Mi,x,M),a[i],M))%M;
	}
	return (ans+M)%M;
}
int main(){
	scanf("%d",&n);
	for (int i=1;i<=n;i++){
		scanf("%d",&a[i]);
	}
	for (int i=1;i<=n;i++){
		scanf("%d",&b[i]);
		a[i]=(a[i]%b[i]+b[i])%b[i];
	}
	printf("%lld",CRT(a,b,n));
	return 0;
}

2020/11/29 22:37
加载中...