poj-2891(Strange Way to Express Integers)--中国剩余定理&&扩展欧几里得

题意:找到一个m,使得m%ai=ri,并且这个m最小

  m = a1*x + r1;

  m = a2*y + r2;

可得:a1*x - a2*y = r2 - r1

可得:a1*x  r2-r1(moda2);

r = gcd(a1,a2);

求一次同余线性方程---判定条件 (r2-r1)%  r==0

解得 x  ((r2-r1)/r)*x%(a2/r)+a2/r)%(a2/r);

 r1 = a1 * x + r1;

a1 = a1 * a2 / r;再与下一个等式求解


#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
typedef __int64 LL;
LL x,y;
LL ecgcd(LL a,LL b)
{
    if(b == 0) {x = 1,y = 0;return a;}
    int k = ecgcd(b,a%b);
    LL t = x;
    x = y;
    y = t - a/b*y;
    return k;
}
int main()
{
    LL n,a1,a2,r1,r2;
    while(~scanf("%I64d",&n))
    {
        scanf("%I64d%I64d",&a1,&r1);
        bool flag = false;
        for(LL i = 2;i <= n;i++)
        {
            scanf("%I64d%I64d",&a2,&r2);
            if(flag) continue;
            LL r = ecgcd(a1,a2);
            LL R = r2 - r1;
            if(R%r) {flag = true;continue;}//求解一次同余式的判定
            LL mod = a2/r;
            x = (R/r*x%mod+mod) % mod;//解得a1*x = R (mod a2);的一个特解 即最小值
            r1 = x*a1 + r1;
            a1 = a1*a2/r;
        }
        if(flag) printf("-1\n");
        else printf("%I64d\n",r1);
    }
}

若还是不明白:点这里  http://hi.baidu.com/buaa_babt/item/5f4c013772c7cbe3e6bb7a2d

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值