hdoj-2041超级楼梯(排列组合)
超级楼梯
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 41216 Accepted Submission(s): 21084
Problem Description
有一楼梯共M级,刚开始时你在第一级,若每次只能跨上一级或二级,要走上第M级,共有多少种走法?
Input
输入数据首先包含一个整数N,表示测试实例的个数,然后是N行数据,每行包含一个整数M(1<=M<=40),表示楼梯的级数。
Output
对于每个测试实例,请输出不同走法的数量
Sample Input
2 2 3
Sample Output
1 2
思路:如果每一步跨两个台阶,令b=(m-1)/2,最多只能走b步(每步都跨两个台阶),剩下的台阶,只能一步一个台阶,a=(m-1)%2步(实际上要么剩下1个台阶,要么恰好到达终点)。
而每次走法,可以有i步可以一步跨两个台阶(0<=i<=b),总计走了a+b,由于在第几步跨两个台阶是随机的,因此要全排列。即;(a+b)全排列,得到的结果要除以a的全排列和b的全排列。(因为a和b的内部步数是无序的不需全排列)
注意:在求全排列的结果时会超int型范围,所以需用long long,用double也行但要注意输出格式。
注:后来听到同学说,才发现此题用 斐波那契数列写非常简单,于是才发现自己想复杂了,看来还是做题太少!!!!
My solution:
/*2015.11.21*/
#include<stdio.h>
double jie(int n)
{
double i,sum;
sum=1;
for(i=1;i<=n;i++)
sum*=i;
return sum;
}
double pailie(int a,int b)
{
double i,j,sum;
sum=jie(a+b)/(jie(a)*jie(b));
return sum;
}
int main()
{
int i,n,t,b;
double sum;
scanf("%d",&t);
while(t--)
{
sum=0;
scanf("%d",&n);
b=(n-1)/2;
for(i=0;i<=b;i++)
sum+=pailie(i,n-1-2*i);
printf("%.0lf\n",sum);
}
return 0;
}