#28.运河——Yucai OJ第19次测试
问题描述
在n座城市,以n座城市所在位置作为顶点,刚好构成一个正n边形。为了促进贸易的发展,需要在某些城市之间开通若干条运河(运河的数量可以为0),运河必须以两座不同的城市作为起始终止位置,沿着直线开通,并且任意两条运河不可以相交(两条运河共用一座城市作为起始终止点也算相交),否则,城市间将因为运河中所用水的费用发生战争。求开通运河的方案数。
输入格式
一行一个整数n。
输出格式
由于结果可能很大,你只需要输出这个答案mod 12345的值。
样例输入
4
样例输出
9
数据规模和约定
对于30%数据:n≤10 n≤10
对于50%数据:n≤100 n≤100
对于100%数据:n≤1000 n≤1000
题解
递推公式:
f[0]=1;
f[1]=1;
f[2]=2;
f[ i ]+=f[ j ]*f[ i - j -2];
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int inf=1000000000; 4 const int mod=12345; 5 const int D=1000; 6 long long f[D+1]; 7 void init(){ 8 f[0]=1; 9 f[1]=1; 10 f[2]=2; 11 for(int i=3;i<=D;++i){ 12 f[i]=0; 13 for(int j=0;j<=i-2;++j){ 14 f[i]+=f[j]*f[i-j-2]; 15 } 16 f[i]+=f[i-1]; 17 if(f[i]>inf){ 18 f[i]%=mod; 19 } 20 } 21 return; 22 } 23 int main(){ 24 int n; 25 init(); 26 cin>>n; 27 cout<<f[n]%mod<<endl; 28 return 0; 29 }