描述
你知道嗎?北航不僅有ACM訓練隊,而且有ACM長跑隊。魔鬼的訓練,就從這裡開始……
每天晚上10點鐘他們都在體育場集合,排成一字。隨後,隊長Leo會勒令他們按照Fibonacci數列報數。順便說一句,Leo特別喜歡 Fibonacci數列,因此長跑隊成員每天跑的圈數都是Fibonacci數列中的某一項。Fibonacci數列第1項和第2項為1,從第3項開始每 一項都等於它之前兩項的和。
| n |
1 |
2 |
3 |
4 |
5 |
6 |
…… |
| Fn |
1 |
1 |
2 |
3 |
5 |
8 |
…… |
這天,Leo跑步無聊,要與DDR的rzc小朋友PK。他們約定比賽N天,這N天中跑的圈數是Fibonacci數列中從第K項開始的連續N項。圈數的順 序可以自行選擇,但是,leo不許rzc小朋友在任何一天和他跑同樣的圈數——一定要分個勝敗他才滿意。
現在需要你計算的是,Leo與rzc小朋友的長跑PK賽,到底有多少種可能的情況?
如範例中第2組資料:Leo和rzc將在2天內跑1圈和2圈,有兩種情況。
| |
player |
1st day |
2nd day |
| case 1: |
Leo |
1 |
2 |
| rzc |
2 |
1 |
| case 2: |
Leo |
2 |
1 |
| rzc |
1 |
2 |
輸入
多組輸入資料。
每組資料只有一行,即兩個整數K和N,(1≤K<231, 0≤N≤8)。
輸入以-1 -1結束。
輸出
對每組資料輸出一行,為可能的情況數。
範例輸入1 0
2 2
3 3
-1 -1範例輸出1
2
12
解題思路:
這題徹底無語,如果通過程式來算多半是會逾時的,建議手工算一下,然後很變態的過掉。
因為N只從1-8,只要計算一下1-8的排列組合有多少種即可。
#include <stdio.h>main(){int a[9]={1,0,2,12,216,5280,190800,9344160,598066560};int b[9]={1,0,0,0,24,720,30240,1612800,109468800}; int n, k;scanf("%d %d",&n,&k);while(n != -1 || k != -1){if(n == 1)printf("%d\n",b[k]);elseprintf("%d\n",a[k]);scanf("%d %d",&n,&k);}}