目錄
- 問題描述
- 輸入格式
- 輸出格式
- 代碼實現
問題描述
小藍有一個長度為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;}
}