列举后直接输出:
View Code
#include<stdio.h> int res[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 }; int main() { int n; while(scanf("%d",&n),n) { printf("%d %d\n",n,res[n]); } return 0; }
而这些数字是怎么列举出来的看下面代码。
将正负号转化为二进制10
i=2 两位
0 0 0
1 0 1
2 1 0
3 1 1
i=3 三位
0 0 0 0
1 0 0 1
2 0 1 0
3 0 1 1
4 1 0 0
5 1 0 1
。。。。。。
View Code
/** 每个符号三角形都是由它的第一行“+,-”号分布决定的,据此可演算出所有分布的三角形, 对其进行统计即可。 同时将一个n行三角形T的+,-号个数分别记为pos_num(n),neg_num(n),其第一行中的+,-号个数 记为x(n),y(n),则可得到下式: pos_num(n)=x(n)+pos_num(n-1) neg_num(n)=y(n)+neg_num(n-1) 由此,我们可以从n=1开始,利用前面n=k-1的结果,迭代求出n=k的分布情形, 然后对n=k的所有分布统计。 */ #include<iostream> #include<vector> #include<cmath> using namespace std; struct record { int pos,neg; record(int a,int b) { pos=a; neg=b; } }; int main() { int n,i,j,k,sum; vector<record> v; for(int m=1; m<=24; m++) { n=m; //n=4; if((n*(n+1))%4!=0) { cout<<n<<" 0"<<endl; continue; } vector<record> v; record r1(0,1);//n=1的情况 v.push_back(r1); record r2(1,0); v.push_back(r2); for(i=2; i<=n; i++) //计算到n的所有情况 { int * trip=new int[i]; int sum_i=(int)pow(2.0,i*1.0); for(j=0; j<sum_i; j++) //第j种分布 { int temp1=j, temp2=i; int x=0, y=0; //记录+,-的个数 while(temp1) { if(temp1%2==0) { trip[--temp2]=0; // cout<<trip[temp2]<<" "; y++; } else { trip[--temp2]=1; //cout<<trip[temp2]<<" "; x++; } temp1/=2; } for(k=0; k<temp2; k++) y++, trip[k]=0;//cout<<trip[k]<<" "; // cout<<endl; int idx=0; for(k=0; k<i-1; k++) { if(trip[k]+trip[k+1]==1) idx*=2; else idx*=2,idx+=1; } x+=v[2*((int)pow(2.0,i-2.0)-1)+idx].pos; y+=v[2*((int)pow(2.0,i-2.0)-1)+idx].neg; record r(x,y);//cout<<">>>"<<x<<" "<<y<<endl; v.push_back(r); } } /**if(n==3){ int star=2*((int)pow(2.0,n-1.0)-1); for(j=0;j<(int)pow(2.0,n*1.0);j++) printf("---%d %d\n",v[star+j].pos,v[star+j].neg); }*/ int base=2*((int)pow(2.0,n-1.0)-1); int num=(int)pow(2.0,n*1.0); sum=0; for(i=0; i<num; i++) { if(v[base+i].pos==v[base+i].neg) sum++; } cout<<n<<" "<<sum<<endl; // } return 0; }
符号三角形
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 477 Accepted Submission(s): 237
Problem Description
符号三角形的 第1行有n个由“+”和”-“组成的符号 ,以后每行符号比上行少1个,2个同号下面是”+“,2个异 号下面是”-“ 。计算有多少个不同的符号三角形,使其所含”+“ 和”-“ 的个数相同 。 n=7时的1个符号三角形如下:
+ + - + - + +
+ - - - - +
- + + + -
- + + -
- + -
- -
+
Input
每行1个正整数n <=24,n=0退出.
Output
n和符号三角形的个数.
Sample Input
15
16
19
20
0
Sample Output
15 1896
16 5160
19 32757
20 59984