hdoj-2041超级楼梯(排列组合)

16 篇文章 0 订阅


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;
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值