NYOJ88(数论)
生活随笔
收集整理的這篇文章主要介紹了
NYOJ88(数论)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
????? 題意明確,讓計(jì)算出起始有m個金片的漢諾塔金片全部移動到另外一個針上時需要移動的最少步數(shù)是多少?(由于結(jié)果太大,現(xiàn)在只要求算出結(jié)果的十進(jìn)制位最后六位)
?????解題思路:大家都很熟悉漢諾塔求移動次數(shù)公式為f(n+1)=f(n)*2+1; 由于0<m<1000000000,按要求,只需要輸出結(jié)果的十進(jìn)制最后六位,即f(n+1)=(f(n)*2+1)%1000000(注意是1后面是6個0,剛開始我就弄錯了)。由于m 取值范圍太大,如果按公式計(jì)算一定會超時。經(jīng)過測試多組數(shù)據(jù)發(fā)現(xiàn),當(dāng)m>100005時,有如下規(guī)律:f(123456)=f(23456); f(123456789)=f(23456789)(老實(shí)說,這規(guī)律確實(shí)不好找),即略去最高位。但還要注意一點(diǎn),當(dāng) m%100000<6 時,則 m=100000+m%10。(這道題讓我糾結(jié)了好長時間)
代碼如下:
View Code ?1?#include<iostream>?2?using?namespace?std;
?3?#define?Max?100006
?4?int?an[Max];
?5?int?main()
?6?{
?7????int?n,i,m;
?8????an[1]=1;
?9????for(i=2;i<Max;i++)
10????????an[i]=(an[i-1]*2+1)%1000000;
11????cin>>n;
12????while(n--)
13????{
14????????cin>>m;
15????????if(m>100005)
16????????{
17????????????if(m%100000<6)?m=100000+m%10;
18????????????else?m%=100000;
19????????}
20????????cout<<an[m]<<endl;
21????}
22????return?0;
23?}
?
轉(zhuǎn)載于:https://www.cnblogs.com/yueshuqiao/archive/2011/08/29/2158887.html
總結(jié)
以上是生活随笔為你收集整理的NYOJ88(数论)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 扣扣保镖我喜欢
- 下一篇: 解决替换weblogic的commons