只wa了最后一个点,求调教(doge
查看原帖
只wa了最后一个点,求调教(doge
125212
Skies楼主2021/6/9 17:14

谢谢大佬

谢谢大佬

谢谢大佬

#include<bits/stdc++.h>
using namespace std;
#define int long long
template<typename T>inline void rd(T &x)
{
	x=0;char q=getchar();int f=1;
	while(q<'0'||q>'9')if(q=='-')f=-1;
	while(q>='0'&&q<='9')
	{
		x=(x<<1)+(x<<3)+q-'0';
		q=getchar(); 
	}
	x=x*f;
}
int n;
const int N=1e5+10; 
int a[N],m[N];
int mod=1;
int x,y;
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);
	int z=x;x=y,y=z-y*(a/b);
	return d;
}
int gcd(int a,int b)
{
	if(b==0)return a;
	return gcd(b,a%b);
}
int lcm(int a,int b)
{
	return a/gcd(a,b)*b;
}
int mul(int x,int y)
{
	int ans=0,k=x;
	while(y)
	{
		if(y&1)ans+=k,ans%=mod;
		y>>=1;
		k<<=1;
		k%=mod;
	}
	return ans;
}

signed main()
{
    scanf("%lld",&n);
    for(int i=1;i<=n;i++)
    {
		scanf("%lld%lld",&m[i],&a[i]);
    	mod=lcm(mod,m[i]);//所有数的lcm,以后来取模
	}
	int M=a[1],xgb=m[1];
	for(int i=2;i<=n;i++)
	{
		exgcd(xgb,m[i],x,y);
		x=(((x%m[i])+m[i])%m[i]);
		x*=((((a[i]-M))%m[i])+m[i])%m[i]/gcd(xgb,m[i]);
		M=M+mul(x,xgb);//常规excrt
		M%=mod;
		xgb=lcm(xgb,m[i]);
	}
	cout<<M%mod;
	
	
    return 0;
}
2021/6/9 17:14
加载中...