TOJ 3428. Fibonacci(Fibonacci數(shù)列的一個(gè)規(guī)律)
題意大概是給一組數(shù)M,N,求出第M個(gè)末位有N個(gè)0的Fibonacci數(shù)列是第幾項(xiàng)。
乍一看,嚇我一跳,結(jié)果在2^31內(nèi),大的驚人。后來拿一個(gè)程序(正好是TOJ的一道題,求1000位內(nèi)的Fibonacci數(shù)列)暴力了下,好家伙,有規(guī)律的。
第一個(gè)末位有1個(gè)0的是第15項(xiàng),第二項(xiàng)第30…然后看末位有2個(gè)0的,第一個(gè)是150項(xiàng),第二個(gè)第300項(xiàng)。然后很高興了寫了個(gè)程序,WA...
有點(diǎn)暈,又暴力了下,加大范圍,發(fā)現(xiàn)第一個(gè)末位3個(gè)0的不是1500項(xiàng),而是750項(xiàng)。無奈了,好奇怪。于是猜只有這一個(gè)特例,依然WA。最后請(qǐng)教了個(gè)
學(xué)長(zhǎng),他說他也是猜的,不過后邊的確實(shí)都是10倍了,就那一個(gè)特例。
接下來其實(shí)過程異常艱辛,不過最終思路很清晰,也AC了。
--------------------------------------------------------我是低調(diào)的分割線-------------------------------------------------------------------------------------
大概是這樣分布的:
15 30 45 ... 150 165 180 195 ... 300 ... 750 ... 1500 ... 7500
第1個(gè)0 第2個(gè)0 第3個(gè)0 第1個(gè)00 第10個(gè)0 第11個(gè)0 第12個(gè)0 第2個(gè)00 第1個(gè)000 第1個(gè)0000
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
所以可以看到,不能直接按間隔算,因?yàn)楸热?50.,它算2個(gè)0,而不是第10個(gè)1個(gè)0。
又不能枚舉,一定會(huì)超時(shí)(確實(shí)超了)
所以可以先按照沒有重疊算,然后加上重疊的,重疊的只算下一個(gè)就好,因?yàn)樵俸筮叺囊簿投及恕?br>算重疊的部分要把特殊的2拿出來。倍數(shù)是5就是 4 1 4 1 4 1這樣分布,10的話就是 9 1 9 1 9 1 9 1 9 1,所以按照這樣算,
比如要求第14個(gè)末位有2個(gè)0的,14%4!=0 ,14/4=3,所以重疊了3次。又比如20, 20%4==0,20/4-1=4,重疊4次。
Code:
乍一看,嚇我一跳,結(jié)果在2^31內(nèi),大的驚人。后來拿一個(gè)程序(正好是TOJ的一道題,求1000位內(nèi)的Fibonacci數(shù)列)暴力了下,好家伙,有規(guī)律的。
第一個(gè)末位有1個(gè)0的是第15項(xiàng),第二項(xiàng)第30…然后看末位有2個(gè)0的,第一個(gè)是150項(xiàng),第二個(gè)第300項(xiàng)。然后很高興了寫了個(gè)程序,WA...
有點(diǎn)暈,又暴力了下,加大范圍,發(fā)現(xiàn)第一個(gè)末位3個(gè)0的不是1500項(xiàng),而是750項(xiàng)。無奈了,好奇怪。于是猜只有這一個(gè)特例,依然WA。最后請(qǐng)教了個(gè)
學(xué)長(zhǎng),他說他也是猜的,不過后邊的確實(shí)都是10倍了,就那一個(gè)特例。
接下來其實(shí)過程異常艱辛,不過最終思路很清晰,也AC了。
--------------------------------------------------------我是低調(diào)的分割線-------------------------------------------------------------------------------------
大概是這樣分布的:
15 30 45 ... 150 165 180 195 ... 300 ... 750 ... 1500 ... 7500
第1個(gè)0 第2個(gè)0 第3個(gè)0 第1個(gè)00 第10個(gè)0 第11個(gè)0 第12個(gè)0 第2個(gè)00 第1個(gè)000 第1個(gè)0000
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
所以可以看到,不能直接按間隔算,因?yàn)楸热?50.,它算2個(gè)0,而不是第10個(gè)1個(gè)0。
又不能枚舉,一定會(huì)超時(shí)(確實(shí)超了)
所以可以先按照沒有重疊算,然后加上重疊的,重疊的只算下一個(gè)就好,因?yàn)樵俸筮叺囊簿投及恕?br>算重疊的部分要把特殊的2拿出來。倍數(shù)是5就是 4 1 4 1 4 1這樣分布,10的話就是 9 1 9 1 9 1 9 1 9 1,所以按照這樣算,
比如要求第14個(gè)末位有2個(gè)0的,14%4!=0 ,14/4=3,所以重疊了3次。又比如20, 20%4==0,20/4-1=4,重疊4次。
Code:
1 #include<stdio.h>
2 int main(void)
3 {
4 int a[18]={0,15,150,750,7500,75000,750000,7500000,75000000,750000000}; //保存第一個(gè)連續(xù)1個(gè)0,2個(gè)0的第一個(gè)
5 int i,j,k,m,n,cas,key;
6 scanf("%d",&cas);
7 while(cas--){
8 scanf("%d%d",&n,&m);
9 key=m*a[n];
10 if(n==2){
11 if(m%4!=0) key+=(m/4)*a[n];
12 else key+=(m/4-1)*a[n];
13 }
14 else{
15 if(m%9!=0) key+=(m/9)*a[n];
16 else key+=(m/9-1)*a[n];
17 }
18 printf("%d\n",key);
19 }
20 }
posted on 2010-04-25 22:50 M.J 閱讀(1983) 評(píng)論(2) 編輯 收藏 引用