PKU POJ 1006 Biorhythms 从“韩信点兵”中想到的

http://acm.pku.edu.cn/JudgeOnline/problem?id=1006 
            题目名字叫Biorhythms,翻译过来大概是“生物节律”吧。 
            这道题并不难,但是,挺有意思的。 
            先来看一个故事 
      传说西汉大将韩信,由于比较年轻,开始他的部下对他不很佩服。有一次阅兵时,韩信要求士兵分三路纵队,结果末尾多2人,改成五路纵队,结果末尾多3人,再改成七路纵队,结果又余下2人,后来下级军官向他报告共有士兵2395人,韩信立即笑笑说不对(因2395除以3余数是1,不是2),由于已经知道士兵总人数在2300?/FONT>2400之间,所以韩信根据23,128,233,------,每相邻两数的间隔是105,便立即说出实际人数应是2333人(因2333=128+20χ105+105,它除以3余2,除以5余3,除以7余2)。这样使下级军官十分敬佩,这就是韩信点兵的故事。 

   简化:已知 n%3=2,n%5=3,n%7=2,求n。 
   再看我们这道题,读入p,e,i,d 4个整数,已知(n+d)%23=p; (n+d)%28=e; (n+d)%33=i ,求n 。 
   是不是一样呢? 

   呵呵,确实一样。想到这里觉得很兴奋。但是韩信是怎么计算出结果的呢? 
   随便google了一下,原来这个东西叫“中国剩余定理”,《孙子算经》中就有计算方法。 
   韩信应该是这样算的: 
      因为n%3=2,n%5=3,n%7=2且3,5,7互质 
      使5×7被3除余1,用35×2=70; 
       使3×7被5除余1,用21×1=21; 
       使3×5被7除余1,用15×1=15。 
      (70×2+21×3+15×2)%(3×5×7)=23 

   同样,这道题也应该是: 
       使33×28被23除余1,用33×28×8=5544; 
       使23×33被28除余1,用23×33×19=14421; 
       使23×28被33除余1,用23×28×2=1288。 
      (5544×p+14421×e+1288×i)%(23×28×33)=n+d 
       n=(5544×p+14421×e+1288×i-d)%(23×28×33)
       由于我们面对的是计算机,所以以上那些很大的数字,可以单独写程序让电脑在近乎0的时候内求出:) 为什么要单独写呢?嘿嘿,为了主程序的效率着想~ 

    程序已经出来了 
 1#include <stdio.h> 
 2void main() 
 3
 4int p,e,i,d,n; 
 5int num=1
 6while(1
 7
 8scanf("%d%d%d%d",&p,&e,&i,&d); 
 9if(p!=-1
10
11n=(5544*p+14421*e+1288*i-d+21252)%21252
12if(n==0)n=21252
13printf("Case %d: the next triple peak occurs in %d days.\n",num++,n); 
14}
 
15else break
16}
 
17
18}
 




 




呵呵,事情到此为止我已经十分开心了,因为我看到还有很多用各种各样方法搞得头昏脑胀都还没有ac的同学们。大家加油吧~ 
但是,还有一点想不明白,我的Memory用了72K,查看这道题的status,很多人竟然只用了20K内存就做出来了,最强的竟然只用了4K!难道有更好的算法??百思不得其解。。。如果有人知道,请告诉我,感谢。 

posted on 2007-09-14 02:12 流牛ζ木马 阅读(3872) 评论(10)  编辑 收藏 引用

评论

# re: PKU POJ 1006 Biorhythms 从“韩信点兵”中想到的 2008-08-07 17:52 lihongbo1008@163.com

使33×28被23除余1,用33×28×8=5544;
使23×33被28除余1,用23×33×19=14421;
使23×28被33除余1,用23×28×2=1288。
(5544×p+14421×e+1288×i)%(23×28×33)=n+d
n=(5544×p+14421×e+1288×i-d)%(23×28×33)


第一行应该是:使33×28被23除余1,用33×28×6=5544;   回复  更多评论   

# re: PKU POJ 1006 Biorhythms 从“韩信点兵”中想到的 2008-12-03 20:49 days

sum = (5544*p +14421*e + 1288*i)%21252;
days = sum -d;
请教一下这样那里出了问题
一直wa  回复  更多评论   

# re: PKU POJ 1006 Biorhythms 从“韩信点兵”中想到的 2008-12-03 20:56 days

(5544×p+14421×e+1288×i)%(23×28×33)=n+d

如果
sum = n+d
n = sum -d
?  回复  更多评论   

# re: PKU POJ 1006 Biorhythms 从“韩信点兵”中想到的 2009-01-15 22:54 画中的黑马

终于看懂了!
“ 同样,这道题也应该是:
使33×28被23除余1,用33×28×8=5544;
使23×33被28除余1,用23×33×19=14421;
使23×28被33除余1,用23×28×2=1288。 ”
这一段好难看明白哦  回复  更多评论   

# re: PKU POJ 1006 Biorhythms 从“韩信点兵”中想到的[未登录] 2009-05-02 16:50 菜鸟

6,19,2是怎么得到的啊  回复  更多评论   

# re: PKU POJ 1006 Biorhythms 从“韩信点兵”中想到的[未登录] 2009-05-02 17:05 菜鸟

看懂了……报告中的错误也太“低级”了,苦了菜鸟我啊
  回复  更多评论   

# re: PKU POJ 1006 Biorhythms 从“韩信点兵”中想到的 2011-08-03 21:53 Tinylamb

@days
没问题。因为(a+b)%c=(a%c+b%c)%c  回复  更多评论   

# re: PKU POJ 1006 Biorhythms 从“韩信点兵”中想到的[未登录] 2011-10-05 00:08 huhu

为什么是*8,*19,*2,百度上看的不是很懂,希望楼主赐教~~拜托了!!!  回复  更多评论   

# re: PKU POJ 1006 Biorhythms 从“韩信点兵”中想到的 2012-06-18 10:40 wpj112

使5×7被3除余1,用35×2=70;
上句中 5*7被3除是余2呀,笔误呀,作者?  回复  更多评论   

# re: PKU POJ 1006 Biorhythms 从“韩信点兵”中想到的 2016-03-09 16:17 physhy

@wpj112
看好,是使它的结果为1。那么你就要凑出5*7*n%3=1,n最小为2。  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2009年5月>
262728293012
3456789
10111213141516
17181920212223
24252627282930
31123456

导航

统计

公告

MY Email/MSN :mars1021@163.com QQ : 27402040 流牛ζ木马

常用链接

留言簿(6)

随笔档案

相册

搜索

最新随笔

最新评论

阅读排行榜

评论排行榜