变同余求最小公倍数

我知道部分同学最近在看中国剩余定理,就这个定理本身,还是比较简单的: 
假设m1,m2,…,mk两两互素,则下面同余方程组: 
x≡a1(mod m1) 
x≡a2(mod m2) 
… 
x≡ak(mod mk) 
在0<=<m1m2…mk内有唯一解。 
记Mi=M/mi(1<=i<=k),因为(Mi,mi)=1,故有二个整数pi,qi满足Mipi+miqi=1,如果记ei=Mi/pi,那么会有: 
ei≡0(mod mj),j!=i 
ei≡1(mod mj),j=i 
很显然,e1a1+e2a2+…+ekak就是方程组的一个解,这个解加减M的整数倍后就可以得到最小非负整数解。 
这就是中国剩余定理及其求解过程。 
现在有一个问题是这样的: 
一个正整数N除以M1余(M1 - a),除以M2余(M2-a), 除以M3余(M3-a),总之, 除以MI余(MI-a),其中(a<Mi<100 i=1,2,…I),求满足条件的最小的数。 

Input

输入数据包含多组测试实例,每个实例的第一行是两个整数I(1<I<10)和a,其中,I表示M的个数,a的含义如上所述,紧接着的一行是I个整数M1,M1...MI,I=0 并且a=0结束输入,不处理。 

Output

对于每个测试实例,请在一行内输出满足条件的最小的数。每个实例的输出占一行。 

Sample Input

2 1
2 3
0 0

Sample Output

5

【题意】

题目的意思 给定k,a

然后再给定 k个数

求最小的N 使得 N%mi =mi -a;

根据同余的性质 我们可以 化简为

N%mi+a=mi

N+a=0(mod mi)

这样题目就变成熟悉的公式了 就是求k个数的最小公倍数,最后减去a

 

#include <iostream>
#include <cstring>
using namespace std;
typedef long long LL;
LL gcd(LL a,LL b)
{
   if(b==0)
    return a;
   else
    return gcd(b,a%b);
}
LL lcm(LL a,LL b)
{
    return a*b/gcd(a,b);
}
int main()
{
    int k,a;
    ios::sync_with_stdio(false);
    while(cin>>k>>a)
    {
        if(k==0&&a==0)
            break;
        LL ans=1,x;
        for(int i=0;i<k;i++)
        {
            cin>>x;
            ans=lcm(ans,x);
        }
        cout<<ans-a<<endl;
    }
    return 0;
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值