題意大概是給一組數(shù)M,N,求出第M個(gè)末位有N個(gè)0的Fibonacci數(shù)列是第幾項(xiàng)。
乍一看,嚇我一跳,結(jié)果在2^31內(nèi),大的驚人。后來(lá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)。然后很高興了寫(xiě)了個(gè)程序,WA...
有點(diǎn)暈,又暴力了下,加大范圍,發(fā)現(xiàn)第一個(gè)末位3個(gè)0的不是1500項(xiàng),而是750項(xiàng)。無(wú)奈了,好奇怪。于是猜只有這一個(gè)特例,依然WA。最后請(qǐng)教了個(gè)
學(xué)長(zhǎng),他說(shuō)他也是猜的,不過(guò)后邊的確實(shí)都是10倍了,就那一個(gè)特例。
接下來(lái)其實(shí)過(guò)程異常艱辛,不過(guò)最終思路很清晰,也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í)超了)
所以可以先按照沒(méi)有重疊算,然后加上重疊的,重疊的只算下一個(gè)就好,因?yàn)樵俸筮叺囊簿投及恕?br>算重疊的部分要把特殊的2拿出來(lái)。倍數(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 }