曹冲养猪
题目大意:给出一个线性同余方程组,求解最小正整数答案。
其实这就是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; }