FZU 猪的安家 解同余线性方程组

本文探讨了如何通过解决线性同余方程组来找出最小可能的数值,涉及数学运算和编程实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


猪的安家

Accept: 861    Submit: 5476
Time Limit: 1000 mSec    Memory Limit : 32768 KB

 Problem Description

Andy和Mary养了很多猪。他们想要给猪安家。但是Andy没有足够的猪圈,很多猪只能够在一个猪圈安家。举个例子,假如有16头猪,Andy建了3个猪圈,为了保证公平,剩下1头猪就没有地方安家了。Mary生气了,骂Andy没有脑子,并让他重新建立猪圈。这回Andy建造了5个猪圈,但是仍然有1头猪没有地方去,然后Andy又建造了7个猪圈,但是还有2头没有地方去。Andy都快疯了。你对这个事情感兴趣起来,你想通过Andy建造猪圈的过程,知道Andy家至少养了多少头猪。

 Input

输入包含多组测试数据。每组数据第一行包含一个整数n (n <= 10) – Andy建立猪圈的次数,解下来n行,每行两个整数ai, bi( bi <= ai <= 1000), 表示Andy建立了ai个猪圈,有bi头猪没有去处。你可以假定(ai, aj) = 1.

 Output

输出包含一个正整数,即为Andy家至少养猪的数目。

 Sample Input

33 15 17 2

 Sample Output

16

解线性同余方程组的最小值。
#include<stdio.h>

__int64 a,b,c,a1,a2,r1,r2,x,y,k;
__int64 exgcd(__int64 A,__int64 &x,__int64 B,__int64 &y)
{
    __int64 x1,y1,x0,y0;
    x0=1;
    y0=0;
    x1=0;
    y1=1;
    __int64 r=(A%B+B)%B;
    __int64 q=(A-r)/B;
    x=0;
    y=1;
    while(r)
    {
        x=x0-q*x1;
        y=y0-q*y1;
        x0=x1;
        y0=y1;
        x1=x;
        y1=y;
        A=B;
        B=r;
        r=A%B;
        q=(A-r)/B;
    }
    return B;
}
__int64 solve()
{
    bool flag=1;
    scanf("%I64d%I64d",&a1,&r1);
    for(__int64 i=1; i<k; i++)
    {
        scanf("%I64d%I64d",&a2,&r2);
        a=a1;
        b=a2;
        c=r2-r1;
        __int64 d=exgcd(a,x,b,y);
        if(c%d!=0)
        {
            flag=0;
        }
        __int64 t=b/d;
        x=(x*(c/d)%t+t)%t;
        r1=a1*x+r1;
        a1=a1*(a2/d);
    }
    if(!flag)return -1;
    return r1;
}
int main()
{
    while(scanf("%I64d",&k)!=EOF)
    {
        printf("%I64d\n",solve());
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值