曹冲养猪

题目大意:给出一个线性同余方程组,求解最小正整数答案。

其实这就是CRT(中国剩余定理)的板子题。

下面是一个线性同余方程组:

k ≡ a1 mod b1

k ≡ a2 mod b2

k ≡ a3 mod b3

首先对第一个式子,我们可以求出一个数x,满足:

1. x ≡ a1 mod b1

2. x ≡ 0   mod bj ( j != 1 )

这两个式子中,第一个可以用exgcd求解,

而第二个其实比第一个简单,只要求b的积去掉当前的b,

为了维护第一项,还需要乘那个数对b1的逆元。

代码:

#include<cstdio>
#include<algorithm>
using namespace std;
#define ll long long
#define N 15
void exgcd(ll a,ll b,ll &x,ll &y)
{
    if(!b)
    {
        x=1;
        y=0;
        return ;
    }
    exgcd(b,a%b,y,x);
    y-=a/b*x;
}
ll n,a[N],b[N];
ll crt()
{
    ll M = 1,ret = 0,x=0,y=0,now;
    for(ll i=1;i<=n;i++)
        M*=b[i];
    for(ll i=1;i<=n;i++)
    {
        now = M/b[i];
        exgcd(now,b[i],x,y);
        x=(x%b[i]+b[i])%b[i];
        ret = (ret+((a[i]*now)%M*x)%M)%M;
    }
    return ret;
}
int main()
{
    scanf("%lld",&n);
    for(ll i=1;i<=n;i++)
        scanf("%lld%lld",&b[i],&a[i]);
    printf("%lld\n",crt());
    return 0;
}

 

posted @ 2018-09-29 15:35  LiGuanlin  阅读(146)  评论(0编辑  收藏  举报