现在的位置: 首页 > 综合 > 正文

hdu-1133

2014年01月28日 ⁄ 综合 ⁄ 共 833字 ⁄ 字号 评论关闭

贴个大数阶乘,乘法,除法的代码

卡特兰数  

合法序列数量 = 序列总数量 - 不合法序列的总量
序列总数可以这样计算m+n 个位置中, 选择 n 个位置出来填上 1, 所以是 C(m+n, n)
不合法序列的数量就是: m+n 个位置中, 选择 m+1 个位置出来填上 1 所以是 C(m+n, m+1)
然后每个人都是不一样的,所以需要全排列 m! * n!

所以最后的公式就是(C(m+n, n)-C(m+n, m+1))*m!*n! 化简后为(m+n)!*(m-n+1)/(m+1);

#include<stdio.h>
int main ()
{
    int i,j,len=1,r,temp;
    int a[201][400]={0};
    a[1][0]=1;
    for(i=2;i<=200;i++)
    {
        for(j=0;j<len;j++)
            a[i][j]=a[i-1][j]*i;
        for(j=0,r=0;j<len;j++)
        {
            temp=a[i][j]+r;
            a[i][j]=temp%10 ;
            r=temp/10;
        }
        while(r)
        {
            a[i][len++]=r%10;
            r/=10;
        }
    }
    int m,n,f=1;
    while(scanf("%d%d",&m,&n) && m+n)
    {
        if(m<n)
        {
            printf("Test #%d:\n",f++);
            puts("0");
        }
        else
        {
            printf("Test #%d:\n",f++);
            len=400;
            int b[500]={0};
            for (j=0,r=0;j<len;j++)
            {
                temp=a[m+n][j]*(m+1-n)+r;
                b[j]=temp%10;
                r=temp/10;
            }
            while(r)
            {
                b[len++]=r;
                r/=10;
            }
            for(j=len-1,r=0;j>=0;j--)
            {
                temp=r*10+b[j];
                b[j]=temp/(m+1);
                r=temp%(m+1);
            }
            while(!b[len])
                len--;
            for(j=len;j>=0;j--)
                printf("%d",b[j]);
            puts("");
        }
    }
    return 0;
}


抱歉!评论已关闭.