求助
查看原帖
求助
304504
蓝__楼主2020/12/22 14:03
#include<bits/stdc++.h>
using namespace std;
long long n,a[1000001],b[1000001],x,y;
void exgcd(long long a,long long b,long long &d,long long &xx,long long &yy){
	if(b==0){xx=1;yy=0;d=a;}
	else{
		exgcd(b,a%b,d,xx,yy);
		long long k=xx;
		xx=yy;yy=k-a/b*yy;
	}
}
long long cheng(long long aa,long long bb,long long mm){
	long long ss=0;
	while(bb>0){
		if(bb&1) ss=(ss+aa)%mm;
		aa=(aa+aa)%mm;
		bb>>=1;
	}
	return (ss%mm+mm)%mm;
}
int main(){
	ios::sync_with_stdio(0);
	cin>>n>>a[1]>>b[1];
	long long m=a[1],ans=b[1];
	for(int i=2;i<=n;i++){
		long long d;
		cin>>a[i]>>b[i];
		//ans+km=b[i](mod a[i])
		//km=(b[i]-ans)mod a[i]
		b[i]=(b[i]-ans%a[i])%a[i];
		exgcd(m,a[i],d,x,y);
		if(b[i]%d!=0){
			for(int j=i+1;j<=n;j++) cin>>a[i]>>b[i];
			cout<<"-1";
			return 0;
		}
		ans+=(cheng(x,b[i]/d,a[i])+a[i])%a[i]*m;
		m=m/d*a[i];
		ans=(ans%m+m)%m;
	}
	cout<<ans;
	return 0;
}

写了快速乘只剩46分了......


这是原来的78分

#include<bits/stdc++.h>
using namespace std;
long long n,a[1000001],b[1000001],x,y;
void exgcd(long long a,long long b,long long &d,long long &xx,long long &yy){
    if(b==0){xx=1;yy=0;d=a;}
    else{
        exgcd(b,a%b,d,xx,yy);
        long long k=xx;
        xx=yy;yy=k-a/b*yy;
    }
}
int main(){
    cin>>n>>a[1]>>b[1];
    long long m=a[1],ans=b[1];
    for(int i=2;i<=n;i++){
        long long d;
        cin>>a[i]>>b[i];
        //ans+km=b[i](mod a[i])
        //km=(b[i]-ans)mod a[i]
        b[i]=(b[i]-ans%a[i])%a[i];
        exgcd(m,a[i],d,x,y);
        if(b[i]%d!=0){
            for(int j=i+1;j<=n;j++) cin>>a[i]>>b[i];
            cout<<"-1";
            return 0;
        }
        ans+=(x*(b[i]/d)%a[i]+a[i])%a[i]*m;
        m=m/d*a[i];
        ans=(ans%m+m)%m;
    }
    cout<<ans;
    return 0;
}

救救孩子吧......

2020/12/22 14:03
加载中...