• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
镂空的行尸
   首页       联系   管理    订阅  订阅

中国剩余定理

LL exGcd(LL a,LL b,LL &x,LL &y)
{
    if(!b)
    {
        x=1,y=0;
        return a;///上面提到的 gcd 值
    }
    LL d=exGcd(b,a%b,y,x);
    y=y-a/b*x;///还原x , y 的必要操作。
    return d;
}


LL chineseRemainder(LL n,LL *a,LL *b)
{
    LL a1=0,a2,b1=1,b2,x,y,ans=0,gcd;
    for(int i=0;i<n;i++)
    {
        b2=b[i],a2=a[i];
        gcd=exGcd(b1,b2,x,y);
        if((a1-a2)%gcd)
            return -1;///无解的时候的返回值
        else
        {
            x=x*((a1-a2)/gcd);
            x=x%(b2/gcd);///得出x的最小值(->0)

            a1=a1-x*b1;
            b1=b1*b2/gcd;///LCM
            a1=a1%b1;
        }
    }
    ans=(a1%b1+b1)%b1;
    if(!ans)///防止余数时为0
        ans=b1;
    return ans;
}

 

more crazy more get!
posted @ 2018-03-11 17:35  镂空的行尸  阅读(86)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3