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