P1251 递推专练3

递推专练3    
描述 Description    
     圆周上有N个点。连接任意多条(可能是0条)不相交的弦(共用端点也算相交)共有多少种方案?
输入格式 Input Format    
     读入一个数N。1<=N<=1000。
输出格式 Output Format    
     由于结果可能很大,你只需要输出这个答案mod 12345的值。

一个点只能有两个状态,要么连线,要么不连;所以让新加入的这个点和所有边连线,能将图分成两个部分,所以此时的方案数就是两个部分的累计和;还有一种情况是这个点不和任何点相连,所以要单独加上f[i - 1];

#include <bits/stdc++.h>

using namespace std;

#define ll long long 
#define INF 0x3f3f3f3f
#define MAXN 1000010
#define MAXM 5010

inline int read()
{
    int x = 0,ff = 1;char ch = getchar();
    while(!isdigit(ch))
    {
        if(ch == '-') ff = -1;
        ch = getchar();
    }
    while(isdigit(ch))
    {
        x = (x << 1) + (x << 3) + (ch ^ 48);
        ch = getchar();
    }
    return x * ff;
}

int n,f[MAXM];

int main()
{
    n = read();
    f[0] = 1; f[1] = 1;
    for(int i = 2;i <= n;++i)
    {
        for(int j = 0;j < i - 1;++j)
            f[i] = (f[i] + f[j] * f[i - j - 2]) % 12345; 
        f[i] = (f[i] + f[i - 1]) % 12345;
    }
    printf("%d\n",f[n]);
    return 0;
}

 

posted @ 2019-03-08 13:34  海边微风起  阅读(345)  评论(0编辑  收藏  举报