求助(最后一个点WA)
查看原帖
求助(最后一个点WA)
378996
UncleSam_Died楼主2023/7/11 15:07
#include <iostream>
using namespace std;
long long x,y;
//参数可为负数的扩展欧几里德定理
void exOJLD(long long a, long long b, long long &x, long long &y){
    //根据欧几里德定理
    if(b == 0){//任意数与0的最大公约数为其本身。
        x = 1;
        y = 0;
    }else{
        long long x1, y1;
        exOJLD(b, a%b, x1, y1);
        if(a*b < 0){//异号取反
            x = - y1;
            y = a/b*y1 - x1;
        }else{//同号
            x = y1;
            y = x1 - a/b* y1;
        }
    }
}
//剩余定理
long long calSYDL(long long a[], long long m[], long long k){
    long long N[k];//这个可以删除
    long long mm = 1;//最小公倍数
    long long result = 0;
    for(long long i = 0; i < k; i++){
        mm *= m[i];
    }
    for(long long j = 0; j < k; j++){
        long long L, J;
        exOJLD(mm/m[j], -m[j], L, J);
        N[j] = m[j] * J + 1;//1
        N[j] = mm/m[j] * L;//2 【注】1和2这两个值应该是相等的。
        result += N[j]*a[j];
    }
    return (result % mm + mm) % mm;//落在(0, mm)之间,这么写是为了防止result初始为负数,本例中不可能为负可以直接 写成:return result%mm;即可。
}
 
long long fa[10000010],fm[10000010];
int main(){
	long long n;
	cin>>n;
	for(long long i=0;i<n;i++){
		cin>>fa[i];
	}
	for(long long i=0;i<n;i++){
		cin>>fm[i];
	}
    cout<<calSYDL(fa, fm, n)<<endl;
    return 0;
}
2023/7/11 15:07
加载中...