C语言铺地砖问题

铺地砖


Time Limit:1000MS  Memory Limit:65536K
Total Submit:711 Accepted:224 


Description 


元旦过去了,新年大酬宾活动也已经告一段落了。陈盖历望着堆在仓库的瓷砖,很无聊的他把这些瓷砖裁成很多1X1 1X2 1X3的小瓷砖,然后他把这些小瓷砖排在地上画的一个1*n的长方形里。问铺满这个长方形共有多少种方法?


Input 


首先输入一个整数T,表示有T组测试数据 
然后是T行,每行输入1个正整数n(n<=50)


Output 


对于每个n输出铺的方法种数


Sample Input 




3
1
2
3


Sample Output 
1
2
4
我想的是先穷举面积和等于n的所有情况,再排列组合
可是这个程序运行还行,交上去不知道为什么runtime error,说可能有除以0的情况
我在前面写了两个阶乘函数
#include//kan xia si da de dai ma!
int F(int n)
{
    int i,p;
    p=1;
    for(i=1;i<=n;i++)
    {
        p*=i;
    }
    return p;
}
int f(int m,int n)
{
    int i,p;
    p=1;
    for(i=n-m+1;i<=n;i++)
    {
        p*=i;
    }
    return p;
}
int main()
{
    int T,i,n,count,j,k,l,m;
    scanf("%d",&T);
    for(i=0;i     {
        count=0;
        scanf("%d",&n);
        for(j=0;j<=50;j++)
        {
            for(k=0;k<=25;k++)
            {
                for(l=0;l<=16;l++)
                {
                    if(n==j+2*k+3*l)
                    {m=j+k+l;
                     count+=F(m)-(F(j)-1)*(f(j,m)/F(j))-(F(k)-1)*(f(k,m)/F(k))-(F(l)-1)*(f(l,m)/F(l));//所有排列情况减去重复的情形
                    }
                }
                
            }
        }
        printf("%d\n",count);
    }
    return 0;
}

你可能感兴趣的:(C语言铺地砖问题)