此题出自:Codeforces Round #750 (Div. 2)
Thought:
容易得出规律,满足条件的子数组数量为:cnt1 * 2^cnt0。
Attention:
①用c/c++语言,很容易想到用pow函数,但是!容易出现问题:pow函数变量是double型,而我们的cnt0为int型,所以可以自定义函数。
②虽然ai的范围在int型之内,但数组长度可达60,也就是说,子数组数量可能达到大概2^60是一个很大的数,最好用long long做函数返回值。
Code:
// #define LOCAL
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
ll llpow(int x, int y);
int main(void)
{
#ifdef LOCAL
freopen ("in.txt", "r", stdin);
freopen ("out.txt", "w", stdout);
#endif
int t;
cin >> t;
int n;
int a;
while (t--) {
int n0 = 0, n1 = 0;
scanf("%d",&n);
for (int i = 0; i < n; i++) {
scanf("%d",&a);
if (a==0) n0++;
if (a==1) n1++;
}
ll num = n1 * llpow(2,n0);
printf("%lld\n",num);
}
return 0;
}
ll llpow(int x, int y)
{
ll result = 1;
for (int i = 0; i < y; i++) {
result *= x;
}
return result;
}