poj 2891

转载:

/**********************一般模线性方程组***********************/

同样是求这个东西。。
X mod m1=r1
X mod m2=r2
...
...
...
X mod mn=rn

首先,我们看两个式子的情况
X mod m1=r1……………………………………………………………(1)
X mod m2=r2……………………………………………………………(2)
则有 
X=m1*k1+r1………………………………………………………………(*)
X=m2*k2+r2
那么 m1*k1+r1=m2*k2+r2
整理,得
m1*k1-m2*k2=r2-r1
令(a,b,x,y,m)=(m1,m2,k1,k2,r2-r1),原式变成
ax+by=m
熟悉吧?

此时,因为GCD(a,b)=1不一定成立,GCD(a,b) | m 也就不一定成立。所以应该先判 若 GCD(a,b) | m 不成立,则!!!方程无解!!!。
否则,继续往下。

解出(x,y),将k1=x反代回(*),得到X。
于是X就是这两个方程的一个特解,通解就是 X'=X+k*LCM(m1,m2)
这个式子再一变形,得 X' mod LCM(m1,m2)=X
这个方程一出来,说明我们实现了(1)(2)两个方程的合并。
令 M=LCM(m1,m2),R=r2-r1
就可将合并后的方程记为 X mod M = R。

然后,扩展到n个方程。
用合并后的方程再来和其他的方程按这样的方式进行合并,最后就能只剩下一个方程 X mod M=R,其中 M=LCM(m1,m2,...,mn)。
那么,X便是原模线性方程组的一个特解,通解为 X'=X+k*M。

如果,要得到X的最小正整数解,就还是原来那个方法:

X%=M;

if (X<0) X+=M;

#include <iostream>
#include <cstdio>
#include<cmath>
#include<algorithm>
#include<cstdlib>
#define max 100000
using namespace std;
long  long ex_gcd(long  long a,long  long b,long  long &x,long  long &y)
{
    if(!b)
    {
        x=1;
        y=0;
        return a;
    }
    int d=ex_gcd(b,a%b,x,y);
    int t=x;
    x=y;
    y=t-a/b*y;
    return d;
}
long long ex_crl(long  long *w,long  long *a,long  long n)
{
    long  long m=w[0],r=a[0];
    long  long x,y;
    for(int i=1;i<n;++i)
    {
        long  long d=ex_gcd(m,w[i],x,y);
        if((a[i]-r)%d)
            return -1;
            long long t=(w[i]/d);
        x=(x*((a[i]-r)/d)%t+t)%t;//最小正整数解
        r+=x*m;//特解
        m=m*w[i]/d;//lcm
        r%=m;//特解%lcm
    }
    if(r<0)
        r+=m;
    return r;
}
int main()
{
    int n;
    while(cin>>n)
    {
        long  long w[max],a[max];
        for(int i=0;i<n;++i)
            cin>>w[i]>>a[i];
        cout<<ex_crl(w,a,n)<<endl;
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值