题目描述
输入:
n(1<n<=27)
n
(
1
<
n
<=
27
)
.
输出不同方案的个数.
测试用例
输入
2
3
输出
0
4
分析
坑点:网教有时间限制,故需要打表。
代码
#include<iostream>
#include<cstring>
using namespace std;
int n, half, counter;
long sum;
int p[30][30];
void BackTrace(int t)
{
if (counter > half || t * (t - 1) / 2 - counter > half)
return;
if (t > n)
{
sum++;
return;
}
for (int i = 0; i < 2; i++)
{
p[1][t] = i;
counter += i;
for (int j = 2; j <= t; j++)
{
p[j][t - j + 1] = p[j - 1][t - j + 1] ^ p[j - 1][t - j + 2];
counter += p[j][t - j + 1];
}
BackTrace(t + 1);
for (int j = 2; j <= t; j++)
{
counter -= p[j][t - j + 1];
}
counter -= i;
}
}
int main()
{
while (~scanf("%d", &n))
{
counter = 0;
sum = 0;
half = n * (n + 1) / 2;
if (half % 2 != 0)
{
printf("0\n");
continue;
}
switch (n)
{
case 27:
printf("5804913\n");
continue;
case 24:
printf("822229\n");
continue;
case 23:
printf("431095\n");
continue;
case 20:
printf("59984\n");
continue;
}
half /= 2;
memset(p, 0, sizeof(p));
BackTrace(1);
printf("%d\n", sum);
}
return 0;
}