题目链接:HDU2510
分析:打24个表就好了,其实只要决定第一行就可以,然后下面每一行按规则放,然后check一下两个的个数是否相等;
打表程序:
#include<bits/stdc++.h>
using namespace std;
int ans,n;
int a[30][30];
void dfs(int num)
{
if(num==n+1)
{
for(int i=n-1;i>0;i--)
for(int j=1;j<=i;j++)
a[i][j]=a[i+1][j]^a[i+1][j+1];
int s1=0,s2=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=i;j++)
if(a[i][j]) s2++;else s1++;
if(s1==s2) ans++;
return;
}
for(int i=0;i<=1;i++)
{
a[n][num]=i;
dfs(num+1);
}
return;
}
int rua()
{
memset(a,-1,sizeof(a));
ans=0;
dfs(1);
return ans;
}
int main()
{
for(int i=1;i<=24;i++) n=i,printf("%d\n",rua());
return 0;
}
ac代码:
#include<bits/stdc++.h>
using namespace std;
int ans[]={0,0,0,4,6,0,0,12,40,0,0,171,410,0,0,1896,5160,0,0,32757,59984,0,0,431095,822229},n;
int main(){
while(~scanf("%d",&n) && n) printf("%d %d\n",n,ans[n]);
}