单点时限: 2.0 sec
内存限制: 256 MB
一整块果仁味的巧克力上有许多颗果仁,现在想把它分为大小可以不相等的若干块,使得每块上刚好有一颗果仁。
这块巧克力可以表示成一个 0 和 1 组成的序列,其中数字 1 表示这个位置有一颗果仁,0 表示没有。
现在想知道总共有多少种切分方案使得分出的每一块刚好有一颗果仁。
例如,一整块果仁巧克力上面有两颗果仁,表示为 101,则总共有两种切分方案,可以将其切分成各有一颗果仁的两块,具体方案为:(1)|(01) 或者 (10)|(1)。
输入格式
第 1 行:一个整数 T (1≤T≤10) 为问题数。
对应每个问题有两行,第一行有一个整数 n (1≤n≤100,表示果仁巧克力大小),接下来一行为 n 个空格分隔的数字(0 或者 1)。
输出格式
对于每个问题,输出一行问题的编号(0 开始编号,格式:case #0: 等)
然后对应每个问题在一行中输出方案数(由于结果较大,建议用 64 位整数存储结果)。
样例
input
3
3
1 0 1
5
0 1 0 1 0
6
1 0 1 0 1 0
output
case #0:
2
case #1:
2
case #2:
4
/*
思路:先去头和去尾,当前前面切的方法为ans,后面遇到连续的m个0切的方法为ans*(m+1),遇到1就跳过。
*/
#include<iostream>
using namespace std;
int main() {
int t;
cin>>t;
for(int i = 0; i < t; i++) {
int n;
cin>>n;
int a[n];
int flag=0;
for(int j = 0; j < n; j++) {
cin>>a[j];
if(a[j]==1)
flag=1;
}
printf("case #%d:\n",i);
if(flag==0)
{
cout<<0<<endl;
continue;
}
int j =0,z=n-1;
while(a[j]==0&&j<n)j++;
while(a[z]==0&&z>=0)z--;
long long ans=1;
j++;
z--;
while(j<=z) {
int sum=1;
int k=j;
while(a[k]==0&&k<=z) {
sum++;
k++;
}
ans*=sum;
j=k+1;
}
cout<<ans<<endl;
}
return 0;
}