#include<iostream> #include<string> #include<algorithm> #include<cstdlib> #include<cstdio> #include<set> #include<map> #include<vector> #include<cstring> #include<stack> #include<cmath> #include<queue> using namespace std; #define CL(x,v); memset(x,v,sizeof(x)); #define INF 0x3f3f3f3f #define LL long long #define REP(i,n) for(int i=0;i<n;i++) const int MAXN=15; int g[MAXN]; int n; //在一个等式的左边,pp为+前的数和,p为+后当前数和 //如a+bb+c=a+bb+c=a+bb+c //当递归到第一个等号时,pp=a+bb,p=c //s为等号和 //cas为递归到的符号 //u为递归的深度 int dfs(int u,int p,int pp,int s,int cas) { if(cas==0){ pp+=p; p=g[u]; } if(cas==1){ pp+=p; p=0; if(s==-1){ s=pp; p=g[u]; pp=0; }else{ if(s!=pp)return 0; p=g[u]; pp=0; } } if(cas==2){ p=p*10+g[u]; } if(u==n-1){ if(s==-1)return 0; if(s==pp+p)return 1; else return 0; } int ans=0; ans+=dfs(u+1,p,pp,s,0); ans+=dfs(u+1,p,pp,s,1); ans+=dfs(u+1,p,pp,s,2); return ans; } int main(){ while(~scanf("%d",&n)) { if(n==0)break; REP(i,n)scanf("%d",&g[i]); int ans=dfs(0,0,0,-1,0); printf("%d\n",ans); } return 0; }
http://oj.huangdiandian.com/OnlineJudge