EXCRT龟速乘TLE了,算法正确,求优化方法
查看原帖
EXCRT龟速乘TLE了,算法正确,求优化方法
95072
wudiss8楼主2021/7/20 16:35

RT,最后三个点TLE了,72pts

#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int mul(int x,int y,int mod){
	int ans=0;
	while(y!=0){
		if(y&1==1)ans+=x,ans%=mod;
		x+=x;
		x%=mod;
		y>>=1;
	}
	return ans;
}
inline int exgcd(int a,int b,int &x,int &y){
	if(b==0){
		x=1;y=0;
		return a;
	}
	int d=exgcd(b,a%b,x,y),t=x;
	x=y;
	y=t-(a/b)*y;
	return d;
}
inline int read(){
	char c=getchar();
	int s=0,f=1;
	while(c<'0' or c>'9'){
		if(c=='-')f=-1;
		c=getchar();
	}
	while(c>='0' and c<='9'){
		s=(s<<1)+(s<<3)+c-'0';
		c=getchar();
	}
	return s*f;
}
signed main(){
	int n,a1,a2,b1,b2,x,y,gcd,lcm;
	n=read();
	for(register int i=1;i<=n;i++){
		if(i==1){
		    a1=read();b1=read();
	    }else{
	    	a2=read();b2=read();
	    	gcd=exgcd(a1,a2,x,y);
	    	//if(gcd<0)gcd=-gcd;
	    	lcm=a1*a2/gcd;
	    	x=x*(b2-b1)/gcd;
	    	b1=mul(x,a1,lcm)+b1;
	    	b1%=lcm;
	    	a1=lcm;
	    	while(b1<0)b1+=a1;
		}
	}
	while(b1<0)b1+=a1;
	printf("%lld\n",b1%a1);
	return 0;
}
2021/7/20 16:35
加载中...