EXCRT求助
查看原帖
EXCRT求助
227728
冰糖鸽子「僕は…」楼主2021/3/2 18:33

RT,用的 __int128

// Problem: P4777 【模板】扩展中国剩余定理(EXCRT)
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P4777
// Memory Limit: 500 MB
// Time Limit: 1000 ms
// Powered by CP Editor (https://github.com/cpeditor/cpeditor)

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define M 100005
__int128 sad,ans,lcm;
int n,a[M],b[M],Y,X;
void ct(string s)
{
    cout<<s<<endl;
}
int Exgcd(int fx,int fy,int &x,int &y)
{
    if(!fy){x=1;y=0;return fx;}
    int fz=Exgcd(fy,fx%fy,y,x);
    y-=x*(fx/fy);return fz;
}
void Merge(int w)
{
    int g=Exgcd(lcm,a[w],X,Y);
    X*=(b[w]-ans)/g;Y*=(b[w]-ans)/g;
    if(X<=0)
    {
        X+=(-X/a[w])*a[w];
        if(X<=0) X+=a[w];
    }
    else
    {
        X-=(X/a[w])*a[w];
        if(X<=0) X+=a[w];
    }
    ans=ans+X*lcm;
    lcm=lcm*a[w]/g;
    if(ans<0||lcm<0) ct("D");
    ans-=(ans/lcm)*lcm;
    if(ans<=0) ans+=lcm;
    if(w!=n) Merge(w+1);//递归部分
}
signed main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i]>>b[i];
    }
    // cout<<lcm<<' ';
    ans=b[1];lcm=a[1];
    Merge(2);//递归合并式子
    ans-=(ans/lcm)*lcm;
    if(ans<=0) ans+=lcm;
    n=ans;//int128无法直接输出
    cout<<n<<endl;
    return 0;
}
2021/3/2 18:33
加载中...