WA on #15 顺便请教一下__int128怎么用(
查看原帖
WA on #15 顺便请教一下__int128怎么用(
670012
kinuru楼主2022/5/22 18:06
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long LL;
void exgcd(LL a,LL b,LL &x,LL &y)//扩展欧几里得
{
    if(!b) x=1,y=0;
    else
    {
        exgcd(b,a%b,x,y);
        LL t=x;
        x=y;
        y=t-a/b*y;
    }
}

LL gcd(LL a,LL b)//辗转相除
{
    return b ? gcd(b,a%b):a;
}

int main()
{
    int n;
    cin>>n;
    LL a0,m0;
    cin>>a0>>m0;
    
    for(int i=1;i<n;i++)
    {
        LL a2,m2;
        cin>>a2>>m2;
        LL k1,k2;
        LL d=gcd(a0,-a2),y=m2-m0;// gcd(a0,a2)=gcd(a0,-a2).
        if(y%d){cout<<-1<<endl;return 0;}//无解。
        
        exgcd(a0,-a2,k1,k2);//扩展欧几里得

        k1=(LL)k1*y/d,k2=(k2/d)*y;//裴蜀定理
        
        //如果下面两行不写的话,k1此时并不为最小非负。
        //后面迭代的m0会出错。
        LL t=abs(a2/d);
        k1=(k1%t+t)%t;//以k1为底层来不断进行更新,找到k1的最小非负数解。
        
        m0=m0+k1*a0,a0=abs(a0/d*a2);
    }
    cout<<(m0%a0+a0)%a0<<endl;//x的最小非负数解
    return 0;
}
2022/5/22 18:06
加载中...