進数

進数

説明

n個の異なる2進数を求めているノードの各ノードの<= 100は、等価な構成であると考えられる.N!

入力

整数n、ノード数を入力。

出力

出力は答えを、対応します。

サンプル入力

3

サンプル出力

5

ヒント

ソース

#include <bits/stdc++.h>
using namespace std;
int f[101][1000];
int tmp[1000];
void mul(int *c,int *a,int *b)
{
    int l1=a[0],l2=b[0],l3;
    l3=l1+l2-1;
    for(int i=1;i<=l1;i++)
        for(int j=1;j<=l2;j++)
        {
            c[i+j-1]+=a[i]*b[j];
            c[i+j]+=c[i+j-1]/10;
            c[i+j-1]%=10;
        }
    while(c[l3+1]>0)
    {
        l3++;
        c[l3+1]+=c[l3]/10;
        c[l3]%=10;
    }
    c[0]=l3;        
}
void add(int *a,int *b)
{
    int l;
    if(a[0]>b[0]) l=a[0];
    else l=b[0];
    for(int i=1;i<=l;i++)
    {
        a[i]+=b[i];
        a[i+1]+=a[i]/10;
        a[i]%=10;
    }
    while(a[l+1]>0)
    {
        l++;
        a[l+1]+=a[l]/10;
        a[l]%=10;
    }
    a[0]=l;
}
int main()
{
    int n;
    memset(f,0,sizeof(f));
    cin>>n;
    f[0][0]=1,f[0][1]=1;
    f[1][0]=1,f[1][1]=1;
    for(int i=2;i<=n;i++)
    {
        f[i][0]=1,f[i][1]=0;
        for(int j=0;j<=i-1;j++)
        {
            memset(tmp,0,sizeof(tmp));
            mul(tmp,f[j],f[i-1-j]);
            add(f[i],tmp);
        }
    }
    for(int i= f[n][0];i>=1;i--)
    printf("%d", f[n][i]);
    return 0;
}

おすすめ

転載: www.cnblogs.com/LJA001162/p/12079213.html