模板 CRT 70pts 求调
查看原帖
模板 CRT 70pts 求调
728459
HeYilin楼主2024/7/20 11:46

Rt.

(注释里是 WA 掉的数据)

70pts:

//CRT 模板
#include<bits/stdc++.h>
typedef long long int ll;
using namespace std;
const int maxn=1e2+10;
ll n,a[maxn],m[maxn],M_=1,M[maxn],p[maxn],q,ans;
ll exgcd(ll a,ll b,ll &x,ll &y){
	if(!b){
		x=1,y=0;
		return a;
	}
	ll d=exgcd(b,a%b,x,y);
	ll t=x;
	x=y,y=t-a/b*y;
	return b;
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++)cin>>m[i]>>a[i];
	for(int i=1;i<=n;i++)M_*=m[i];
	for(int i=1;i<=n;i++)M[i]=M_/m[i];
	for(int i=1;i<=n;i++)exgcd(M[i],m[i],p[i],q);
	for(int i=1;i<=n;i++)ans+=M[i]*p[i]*a[i]%M_,ans%=M_;
	cout<<ans%M_;
	return 0;
}
/*
3
3 1
5 1
7 2

*/

加上了 __int128 后:

#include<bits/stdc++.h>
typedef long long int ll;
using namespace std;
const int maxn=1e2+10;
ll n,a[maxn],m[maxn],M_=1,M[maxn],p[maxn],q;
__int128 ans;
ll exgcd(ll a,ll b,ll &x,ll &y){
	if(!b){
		x=1,y=0;
		return a;
	}
	ll d=exgcd(b,a%b,x,y);
	ll t=x;
	x=y,y=t-a/b*y;
	return b;
}
void print(__int128 x){
	if(x==0)return;
	print(x/10);
	cout<<(int)(x%10);
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++)cin>>m[i]>>a[i];
	for(int i=1;i<=n;i++)M_*=m[i];
	for(int i=1;i<=n;i++)M[i]=M_/m[i];
	for(int i=1;i<=n;i++)exgcd(M[i],m[i],p[i],q);
	cout<<"M_ : "<<M_<<"\n";
	for(int i=1;i<=n;i++){
//		cout<<"---> "<<ans<<"\n";
		ans+=M[i]*p[i]*a[i]%M_;
		ans%=M_;
	}
	ans%=M_;
	print(ans);
	return 0;
}
/*
3
99991 99990
99989 99988
99971 99970

*/

输出都不利索了

2024/7/20 11:46
加载中...