0
点赞
收藏
分享

微信扫一扫

题256.洛谷P1495 中国剩余定理-【模板】中国剩余定理(CRT)/曹冲养猪

小猪肥 2022-03-14 阅读 55

文章目录


题256.洛谷P1495 中国剩余定理-【模板】中国剩余定理(CRT)/曹冲养猪


一、关于中国剩余定理CRT

1.概述

2.算法步骤

二、题目

在这里插入图片描述

三、题解

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
const int maxn=1e5+1;

ll a[maxn],b[maxn];

ll ex_gcd(ll a,ll b,ll &x,ll &y)//扩展欧几里得算法
{
    if(b==0)
    {
        x=1;
        y=0;
        return a;
    }
    ll ans=ex_gcd(b,a%b,x,y);
    ll tmp=x;
    x=y;
    y=tmp-a/b*y;
    return ans;
}

ll CRT(ll a[],ll b[],int N)
{
    ll n=1;
    for(int i=0;i<N;i++)//得到所有除数的乘积
    {
        n*=a[i];
    }
    ll res=0;
    for(int i=0;i<N;i++)
    {
        ll m=n/a[i];//得到a[i]以外所有的除数的倍数m
        ll mm,y;
        //利用扩欧求m的逆元mm
        ex_gcd(m,a[i],mm,y);
        mm=(mm%a[i]+a[i])%a[i];//最小正整数x为(x%b/gcd(a,b)+b/gcd(a,b))%b/gcd(a,b)
        res=(res%n+m*mm*b[i]%n)%n;//线性同余方程组的唯一解res为(m*mm*余数)求和
    }
    return res;
}

int main()
{
    int N;
    cin>>N;
    for(int i=0;i<N;i++)
    {
        cin>>a[i]>>b[i];
    }
    ll res=CRT(a,b,N);
    cout<<res;
}

举报

相关推荐

0 条评论