目录
- 问题描述
- 输入格式
- 输出格式
- 代码实现
问题描述
小蓝有一个长度为N的数组A=[A0,A1,… AN-1]。现在小蓝想要从A对应的数组下标所构成的集合Ⅰ=0,1,2,…,N -1中找出一个子集R1,那么R1在Ⅰ中的补集为R2。记S1∈∑Ar,S2∈∑Ar,我们
要求S1和S2均为偶数
,请问在这种情况下共有多少种不同的R1。当R1或R2为空集时我们将S1或S2视为0。
输入格式
第一行—个整数T,表示有T组数据。
接下来输入T组数据,每组数据包含两行:第一行一个整数N,表示数组A的长度;
第二行输入N个整数从左至右依次为A0,A1,…AN-1,相邻元素之间用空格分隔。
2
2
6 6
2
1 6
输出格式
对于每组数据,输出一行,包含一个整数表示答案,答案可能会很大,你需要将答案对1000000007
进行取模后输出。
4
0
代码实现
import java.util.Scanner;public class Main{public static void main(String[] args) {Scanner scan = new Scanner(System.in);//在此输入您的代码...int T = scan.nextInt();//T组数据for (int i = 0; i < T; i++) {int N = scan.nextInt();//每组数据的个数int[] arr = new int[N];for (int j = 0; j < N; j++) {arr[j] = scan.nextInt();//存入每组数据到静态数组}//计算每组数据中 题目要求的情况数量int cnt = method(arr);//调用函数System.out.println(cnt);//打印每组数据的情况数量}scan.close();}public static int method(int[] arr) {int cnt = 0;//情况数量int qi = 0;//奇数个数int ou = 0;//偶数个数for (int i = 0; i < arr.length; i++) {if (arr[i] % 2 == 0) {ou++;} else {qi++;}}if (qi % 2 == 0) {//如果奇数个数为 偶数,则表示满足题目条件cnt = (int) (Math.pow(2, ou) * Math.pow(2, qi == 0 ? qi : qi - 1) % 1000000007);//数学公式:2的偶数次方*2的奇数次方 取模//偶数成单出现,奇数成双,所以奇数要减半 也就是幂减一}//反之则不满足题目条件return cnt;}
}