忘了是joj第几题了 剩余定理

本文介绍了解决中国剩余定理问题的算法实现,并通过一个具体的编程实例展示了如何求解此类问题。中国剩余定理在数学和计算机科学中有着广泛的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<stdio.h>  
int mod(int c[],int b[],int n)  
{  
    int all_multy=1,sum=0;  
    int i,j,x[5];  
    for(i=0;i<n;i++)  
        all_multy*=c[i];  
    for(i=0;i<n;i++)  
        x[i]=all_multy/c[i];  
    for(i=0;i<n;i++)  
    {  
        j=1;  
        while((x[i]*j)%c[i]!=1)  
            j++;  
       x[i]*=j;  
    }  
    for(i=0;i<n;i++)  
        sum+=(b[i]*x[i]);  
    return sum%all_multy;  
}  
int main()  
{  
    int n,c[5],b[5],i;  
    while(scanf("%d",&n),n)  
    {  
        for(i=0;i<n;i++)  
            scanf("%d%d",&c[i],&b[i]);  
        printf("%d/n",mod(c,b,n));  
    }  
    return 0;  

/*假设你现在需要数数篮子里有多少个鸡蛋.尽管数数是件很容易的事情,但不幸的是,你不能一个一个地去数,相反地,你要c个c个(即若干个)地去数,c>1.举个例子,如果你3个3个地去数篮子的鸡蛋,那么最后篮子里会剩下1个鸡蛋;如果你5个5个地去数,那么篮子里最后会剩下3个鸡蛋;如果你7个7个地数,篮子里又会剩下1个鸡蛋.你的任务就是计算出篮子里原来究竟有多少个鸡蛋.

Input Specification(输入详述)

输入将包含若干个测试案例.每个测试案例的第一行只有一个整数N(1<=N<=5),然后接下来的N行,第一行包括两个整数ci和bi(3<=ci<=49,0<=bi<=ci-1,ci是第一个数字).这两个数代表你ci个ci个地数鸡蛋,最终剩下bi个鸡蛋.当N=0时标志着测试案例输入的结束,你不用做任何处理.

Output(输出详述)

对每一个测试案例,你要在每一行上输出一个篮子里可能的最小的鸡蛋数.

解题思路:

看完题目,勿庸置疑,是中国剩余定理的应用.

关于中国剩余定理,有一个广为流传的典故"韩信点兵":

韩信是汉高祖刘邦手下的大将,他英勇善战,智谋超群,为汉朝的建立了卓绝的功劳。据说韩信的数学水平也非常高超,他在点兵的时候,为了保住军事机密,不让敌人知道自己部队的实力,先令士兵从1至3报数,然后记下最后一个士兵所报之数;再令士兵从1至5报数,也记下最后一个士兵所报之数;最后令士兵从1至7 报数,又记下最后一个士兵所报之数;这样,他很快就算出了自己部队士兵的总人数,而敌人则始终无法弄清他的部队究竟有多少名士兵。而韩信点兵的计算方法就是中国剩余定理的一次同余式解法.

而《孙子算经》中的"物不知数"题目,也是中国剩余定理的应用,题目如下:

"今有一些物不知其数量。如果三个三个地去数它,则最后还剩二个;如果五个五个地去数它,则最后还剩三个;如果七个七个地去数它,则最后也剩二个。问:这些物一共有多少?"

用简练的数学语言来表述就是:求这样一个数,使它被3除余2,被5除余3,被7除余2。《孙子算经》给出了这道题目的解法和答案,用算式表示即为:
70*2 + 21*3 +15*2 - 105*2 =23

解题步骤如下:

1.三个质数中两个相乘取得值
则〔3,7〕=21;〔3,5〕=15;〔5,7〕=35;〔3,5,7〕=105

2.值的倍数除以另外一个数字必须余数为1
使35 被3除余1,用35×2=70
使21 被5除余1,用21×1=21
使15 被7除余1,用15×1=15

3. 与余数相乘之和
被3除余2,被5除余3,被7除余2
使35被3除余1,用35×2=70;    70×2   (被3除余2) //70=2*5*7=1(mod3)
使21被5除余1,用21×3=63;    21×3   (被5除余3) //21=3*7=1(mod5)
使15被7除余1,用15×2=30;    15×2   (被7除余2) //15=3*5=1(mod7)
70×2+21×3+15×2=233

4. 得出结果
上一步骤所得结果(233)除以 105 (3×5×7=105) 得余数即所需答案
233 / 105 = 2 余数是 23
所以,70*2 + 21*3 +15*2 - 105*2 =23

(上面说的废话有点多了,嘿嘿~~中国剩余定理别的资料大家就自个上网搜吧!)

好了,下面给出中国剩余定理的定义:

设m1,m2,...mn是两两互素的正整数,
则x≡bi mod mi(i=1,2,...n)在模m1m2m3...mn下有唯一解。
这M=m1m2....mn,Mj=M/mj,且Mjyj≡1 mod mj(j=1,2,...n),
则x=b1M1y1+b2M2y2+...+bnMnyn mod m1m2m3...mn即是符合条件的解。(大家可以根据定义来手动算一算孙子兵法那道题,解题步骤我在上面已经给出来了,共4点)

根据定义就能写出中国剩余定理的程序来了,附上代码(函数ch_mod()就是求解中国剩余定理):*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值