Problem Description
soda has a set S with n integers {1,2,…,n}. A set is called key set if the sum of integers in the set is an even number. He wants to know how many nonempty subsets of S are key set.
Input
There are multiple test cases. The first line of input contains an integer T (1≤T≤105), indicating the number of test cases. For each test case:
The first line contains an integer n (1≤n≤109), the number of integers in the set.
Output
For each test case, output the number of key sets modulo 1000000007.
Sample Input
4
1
2
3
4
Sample Output
0
1
3
7
题意:给你一个元素为1到n的集合S,问集合S的非空子集中元素和为偶数的非空子集有多少个,并对1000000007取模。
题解:我们知道偶数+偶数=偶数,奇数+奇数=偶数,假设现在有a个偶数,b个奇数。则
(
C
a
0
+
C
a
1
+
C
a
2
+
⋅
⋅
⋅
+
C
a
a
)
(
C
b
0
+
C
b
2
+
C
b
4
+
⋅
⋅
⋅
+
C
b
2
k
)
\left ( C_{a}^{0} + C_{a}^{1} + C_{a}^{2} + ··· + C_{a}^{a} \right ) \left ( C_{b}^{0} + C_{b}^{2} + C_{b}^{4} + ··· + C_{b}^{2k} \right )
(Ca0+Ca1+Ca2+⋅⋅⋅+Caa)(Cb0+Cb2+Cb4+⋅⋅⋅+Cb2k)
根据二项式展开公式可得
2
n
−
1
2^{n-1}
2n−1。因为题目要求非空子集,所以最后的结果还需减去空集的情况
C
a
0
C
b
0
C_{a}^{0}C_{b}^{0}
Ca0Cb0,最终结果为
2
n
−
1
−
1
2^{n-1} - 1
2n−1−1。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int mod = 1e9 + 7;
long long power(long long n, long long m, long long mod)
{
long long sum = 1;
n %= mod;
while (m){
if (m % 2)
sum = sum * n % mod;
n = n * n % mod;
m /= 2;
}
return sum;
}
int main()
{
int t;
scanf("%d",&t);
while (t--){
long long n;
scanf("%I64d", &n);
long long sum = power(2, n-1, mod) - 1;
printf("%I64d\n",sum);
}
return 0;
}