1021 Run Run Run!

 

描述

你知道吗?北航不仅有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]);
			
			else
				printf("%d\n",a[k]);
				
	scanf("%d %d",&n,&k);
	}

}


 


你可能感兴趣的:(1021 Run Run Run!)