有一个问题,玄关
查看原帖
有一个问题,玄关
1419569
Z_kazuha楼主2024/12/5 12:59
#include <bits/stdc++.h>
using namespace std;
#define int __int128
const int N=1e5+5;
int n,x,y,gcd,lcm;
struct node{int p,a;}e[N];
void exgcd(int a,int b){
    if(b==0){
        gcd=a,x=1,y=0;
        return;
    }
    exgcd(b,a%b);
    int o=x;
    x=y;
    y=o-a/b*y; 
}
node excrt(node o1,node o2){
    int a1=o1.a,a2=o2.a,p1=o1.p,p2=o2.p,x0;
    exgcd(-p1,p2);
    //cout<<x<<endl;
    assert((a2-a1)%gcd==0);
    int c=(a2-a1)/gcd;
    lcm=(-p1)*p2/gcd;
    x0=(x*(-p1)*c+a1)%lcm;//这里为什么是 -p
    if(x0<0)x0+=lcm;
    return node{lcm,x0};
}
int read() {long long t; cin>>t; return t;}
signed main(){
    n=read();
    for(int i=1;i<=n;i++){
        e[i].p=read(),e[i].a=read();
    }
    if(n==1){cout<<(long long)e[1].a;return 0;}
    node ans=excrt(e[1],e[2]);  
    //cout<<ans.a<<" "<<ans.p<<endl;
    for(int i=3;i<=n;i++){
        ans=excrt(ans,e[i]);
    }
    cout<<(long long)ans.a;
    return 0;
}

注释行

{xa1(modp1)xa2(modp2)\begin{cases} x \equiv a_1 \pmod{p_1} \\ x \equiv a_2 \pmod{p_2} \\ \end{cases}

x=a1+n1p1=a2+n2p2x=a_1+n_1p_1=a_2+n_2p_2

n2p2n1p1=a1a2n_2p_2-n_1p_1=a_1-a_2

n2p2n1p1=(p1,p2)n_2p_2-n_1p_1=(-p_1,p_2)

这里的 p1p_1 是要带负号的

但是上面的 x=a1+n1p1x=a_1+n_1p_1 不用带啊

为什么注释那行不加 - 就不对

2024/12/5 12:59
加载中...