你知道吗?北航不仅有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结束。
对每组数据输出一行,为可能的情况数。
#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]); else printf("%d\n",a[k]); scanf("%d %d",&n,&k); } }