Codeforces Round #750 (Div. 2)的其他题解点我
B. Luntik and Subsequences
题目大意:
给出一个长度为n的序列,其和为s
问有多少个和为s - 1的子序列
子序列由序列删除若干个元素而来
思路:
每次只能从原序列中删除0 和 1
且1必须有,每个0有删与不删两种状态
答案很显然,就是
a
n
s
=
s
u
m
1
∗
2
s
u
m
0
其
中
s
u
m
1
是
1
的
个
数
,
s
u
m
0
是
0
的
个
数
ans = sum1 * 2^{sum0} \\其中sum1是1的个数,sum0是0的个数
ans=sum1∗2sum0其中sum1是1的个数,sum0是0的个数
AC代码:
#include <bits/stdc++.h>
#define PII pair<int,int>
#define ll long long
using namespace std;
const double eps = 1e-8;
const int maxn = 1e5 + 10;
const int mod = 1e9 + 7;
const int INF = 1<<30;
inline void swap(int &x, int &y){x^=y^=x^=y;}
inline int gcd(int a,int b) {return !b ? a : gcd(b,a%b);}
ll a[maxn];
int main(){
int T;
scanf("%d", &T);
while(T--){
int n;
scanf("%d", &n);
int sum1,sum0;
sum1 = sum0 = 0;
for(int i = 1; i <= n; ++i){
scanf("%lld", &a[i]);
if(a[i] == 0)sum0++;
if(a[i] == 1)sum1++;
}
printf("%lld\n", sum1 * (ll)pow(2, sum0));
}
return 0;
}