hdu 1788(多个数的最小公倍数)

Posted AC菜鸟机

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdu 1788(多个数的最小公倍数)相关的知识,希望对你有一定的参考价值。

Chinese remainder theorem again

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2415    Accepted Submission(s): 997


Problem Description
我知道部分同学最近在看中国剩余定理,就这个定理本身,还是比较简单的:
假设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
 
本意是想学习一下中国剩余定理,,结果碰到一水题。
N%Mi = (Mi-a)%Mi => (N+a)%Mi = 0
所以题目就转化为了I个数的最小公倍数,记得开_int64
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <iostream>
#include <math.h>
using namespace std;
typedef long long LL;
LL gcd(LL a,LL b){
    return b==0?a:gcd(b,a%b);
}
LL lcm(LL a,LL b){
    return a/gcd(a,b)*b;
}
int main()
{
    int n;
    LL a;
    while(scanf("%d%lld",&n,&a)!=EOF,n&&a){
        LL ans = 1,num;
        for(int i=0;i<n;i++){
            scanf("%lld",&num);
            ans = lcm(ans,num);
        }
        printf("%lld\n",ans-a);
    }
    return 0;
}

 

 

以上是关于hdu 1788(多个数的最小公倍数)的主要内容,如果未能解决你的问题,请参考以下文章

HDU1019 Least Common Multiple(多个数的最小公倍数)

HDU 1788 Chinese remainder theorem again 中国剩余定理

HDU1788 Chinese remainder theorem again中国剩余定理

HDU 1796 How many integers can you find (容斥)

hdu2236

hdu4106 区间k覆盖问题(连续m个数,最多选k个数) 最小费用最大流 建图巧妙