题解 P1495 【曹冲养猪】

· · 题解

博客食用效果更佳

逐步满足法

举个例子来说:

已知\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 5a\equiv 1\pmod 9

三、最后找出同时满足上面三个试子的最小数: $\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。 ### 同理,再多的方程也是一样的。 于是代码就这样出来了 ```cpp #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); } ```