先存下用规划找出个数的代码
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <cmath>
#include <vector>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
#define rep(i,n) for(int i =0;i<(int)n;i++)
#define rep1(i,x,y) for(int i=(int)x;i<=(int)y;i++)
#define lef 0
#define rig 1
const int N = 51;
ll d[N][N][N][2][2];
bool vis[N][N][N][2][2];
int n , m;
ll dp(int x , int y ,int y2 , int hv1 , int hv2)
{
if(vis[x][y][y2][hv1][hv2]) return d[x][y][y2][hv1][hv2];
vis[x][y][y2][hv1][hv2] = 1;
ll& ans = d[x][y][y2][hv1][hv2];
if(x == m)
{
return ans = (hv1&hv2);
}
ans = 0;
int l1 = 0 , r1 = y2 - 1;
int l2 = y + 1 , r2 = n;
if(hv1 == 0) r1 = y;
else l1 = y;
if(hv2 == 0) l2 = y2;
else r2 = y2;
rep1(i , l1 , r1)
rep1(j , l2 , r2) if(i + 1 <= j)
{
ans += dp(x + 1 , i , j , hv1|(i == 0) , hv2 | (j == n));
}
return ans ;
}
ll cal()
{
memset(vis,false,sizeof(vis));
ll ans = 0;
for(int i = 0 ; i<n ; i++)
for(int j = i + 1 ; j<=n ; j++)
{
ll num = dp(1 , i , j , i == 0, j == n);
ans += num;
}
return ans ;
}
int main()
{
for(int i = 2 ; i<=30 ; i+=2)
{
n = i;
int x = n / 2;
ll res = 0;
for(int i = 1 ; i + i <=x ; i++)
{
int c = 1 ;
if(i != x - i) c = 2;
n = i , m = x - i;
res += cal() * c;
}
cout<<res<<endl;
}
return 0;
}