EXCRT光速乘lcm先除后乘最后一个WA了
查看原帖
EXCRT光速乘lcm先除后乘最后一个WA了
95072
wudiss8楼主2021/7/20 18:56

RT,求大佬康康

#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)ans+=x,ans%=mod;
		x+=x;
		x%=mod;
		y>>=1;
	}
	if(ans < 0) ans += mod; else
	if(ans > mod) ans -= mod;
	return ans;
}*///龟速乘
inline int mul(int a, int b, int mod){
    return (a*b-(long long)((long double)a*b/mod)*mod+mod)%mod;
}
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);
	    	lcm=(a1/gcd)*(a2/gcd)*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);
	return 0;
}
2021/7/20 18:56
加载中...