首页 > 其他 > 详细

洛谷P1495 【曹冲养猪】

时间:2020-01-15 13:22:01      阅读:98      评论:0      收藏:0      [点我收藏+]

逐步满足法

举个例子来说:

已知$\begin{cases}a\equiv 3\pmod 5\\a\equiv 1\pmod 9\\a\equiv 7\pmod {16}\end{cases}$,求a

我们可以这样来想:

一、首先,先找到一个最小的数满足$a\equiv 3\pmod 5$,也就是3。

二、再找到一个最小的数同时满足$a\equiv 3\pmod 5$和$a\equiv 1\pmod 9$:

$\quad\quad$在上面,我们已经找到了满足$a\equiv 3\pmod 5$的3,也就是说当3加上5的倍数时仍满足$a\equiv 3\pmod 5$。所以我们把3一直加5直到找到满足$a\equiv 1\pmod 9$的最小数,也就是28。

三、最后找出同时满足上面三个试子的最小数:

$\quad\quad$由于28加上5的倍数时满足$a\equiv 3\pmod 5$,加上9的倍数时满足$a\equiv 1\pmod 9$,所以加上5和9的公倍数时同时满足$a\equiv 3\pmod 5$和$a\equiv 1\pmod 9$,因为$lcm(5,9)=45$,所以把28一直加45,直到能使$a\equiv 7\pmod {16}$成立,得出这个数为343。

同理,再多的方程也是一样的。

于是代码就这样出来了:

 

#include<bits/stdc++.h>
using namespace std;
long long n,t,now,a[15],b[15];
long long lcm(long long x,long long y){
    long long tim=x*y;
    while(x!=y){
        if(x>y)x=x-y;
        else y=y-x;
    }
    return tim/x;
}
int main(){
    scanf("%lld",&n);
    for(long long i=1;i<=n;i++)scanf("%lld%lld",&a[i],&b[i]);
    t=a[1],now=b[1];
    for(long long i=2;i<=n;i++){
        while(now%a[i]!=b[i])now+=t;
        t=lcm(t,a[i]);
    }
    printf("%lld",now);
}

洛谷P1495 【曹冲养猪】

原文:https://www.cnblogs.com/gzezzry/p/12195769.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!