DP
__
f[i][0] 从前i个中选 当前和(体积)为偶数
f[i][1] 从前i个中选 当前和(体积)为奇数
//偶数
if(a[i] & 1 == 0){
f[i][0] = f[i-1][0] * 2;
f[i][1] = f[i-1][1] * 2;
}
//奇数
if(a[i] & 1 == 1){
f[i][0] = f[i-1][0] + f[i-1][1];
f[i][1] = f[i-1][0] + f[i-1][1];
}
__
import java.util.*;
public class Main{
static int N = 1010,mod = 1000000007;
static int []a = new int[N];
static int [][]f = new int[N][2];
public static void main(String []args){
Scanner in = new Scanner(System.in);
int T = in.nextInt();
while(T -- > 0){
int n = in.nextInt();
long sum = 0;
for(int i = 1;i <= n;i ++){
a[i] = in.nextInt();
sum += a[i];
Arrays.fill(f[i],0);
}
if((sum & 1) == 1){
System.out.println(0);
continue;
}
f[0][0] = 1;
for(int i = 1;i <= n;i ++){
if((a[i]&1) == 0){
f[i][0] = (f[i-1][0] * 2)%mod;
f[i][1] = (f[i-1][1] * 2)%mod;
}
else{
f[i][0] = (f[i-1][0] + f[i-1][1])%mod;
f[i][1] = (f[i-1][0] + f[i-1][1])%mod;
}
}
System.out.println(f[n][0]);
}
}
}
组合计数
/*
R : 偶数的个数
L :奇数的个数
若S1是偶数则:
选 0 -> R 任意个偶数 C(0,R) + C(1,R) + C(2,R) + C(3,R) + C(4,R) + C(R,R) = 2^R
选 0 2 4...偶数个奇数C(0,L) + C(2,L) + C(4,L) + ... + C(L,L) = 2^(L-1)
最后的方案数为 2^R * 2^(L - 1)
*/
import java.util.*;
public class Main{
static int mod = 1000000007;
static long qmi(long a,long k){
long ans = 1;
while(k != 0){
if(k % 2 == 1) ans = (ans * a) % mod;
a = (a * a) % mod;
k /= 2;
}
return ans%mod;
}
public static void main(String []args){
Scanner in = new Scanner(System.in);
int T = in.nextInt();
while(T -- > 0){
int n = in.nextInt();
long r = 0,l = 0;
for(int i = 0;i < n;i ++){
int t = in.nextInt();
if(t % 2 == 0) r ++;
else l ++;
}
//当奇数的个数为奇数时 一方为偶集合 那么另一方必为奇集合
if(l%2 == 1) System.out.println(0);
else System.out.println(qmi(2,r)%mod*qmi(2,l-1)%mod);
}
}
}
完蛋了,第一题都卡壳了
很详细,懂了
🌹🌹🌹
它不是要两个子集都要是偶数吗为啥就dp了一个
大大,想问集合f[i][]的含义为什么是从前i个中选,题意不是从集合中任选几个数组成集合吗
和背包模型差不多
选 0 2 4…偶数个奇数C(0,L) + C(2,L) + C(4,L) + … + C(L,L) = 2^(L-1)
L是奇数,最后应该是C(L-1, L)吧,奇数个中取偶数个
奇数的个数一定是偶数个 如果不是偶数个的话 就无解的
开始分析的时候那个0个奇数因为2^(0-1) = 1 / 2直接作为因子去乘是不对的
但代码里0个奇数做快速幂运算后的为2的-1次幂但结果为1所以就对了,题解中应该把0的情况单独拿出来说一下但代码不用重写因为这个快速幂算法把负数次幂的结果都变成了1因为负数模2永远不可能等于一等除到0就退出循环了然后把原始的ans=1返回了
因为奇数个数为0的时候应该乘以1而不是2^-1
可不可以问一下,这样的方案数公式是怎么推理出来的,自己想了很久,也没明白,谢谢了
二项式