+ + - + - + +
+ - - - - +
- + + + -
- + + -
- + -
- -
+
Outputn和符号三角形的个数.
Sample Input
15 16 19 20 0Sample Output
15 1896 16 5160 19 32757 20 59984
题解:先写一个程序,枚举出0<n<=24的所有情况,可通过位运算巧妙地计算
然后另写一个代码提交即可;
代码1(C语言):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(){
int a[25],b[25];
int i,j,k,cnt1,cnt2;
memset(a,0,sizeof(a));
for(i=1;i<=24;i++){
b[1]=(1<<i)-1;//最大值
while(b[1]>=0){//从最大值开始往下枚举第一层的状态
for(j=2;j<=i;j++){//求出下面n-1层的状态
b[j]=0;
for(k=0;k<(i-j+1);k++){
b[j]|=((((b[j-1]>>k)&1)^((b[j-1]>>(k+1))&1))<<k);
}
}
cnt1=0;
cnt2=0;
for(j=1;j<=i;j++){//遍历每一层的状态
for(k=0;k<i-j+1;k++){//统计当前层
if((b[j]>>k)&1)cnt1++;
else cnt2++;
}
}
if(cnt1==cnt2)a[i]++;
b[1]--;
}
}
for(i=1;i<25;i++)
printf("%d\n",a[i]);
代码2(C语言):
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n,a[25]={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};
while(scanf("%d",&n) && n)
printf("%d %d\n",n,a[n]);
}