Key Set
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 1857 Accepted Submission(s): 973
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 ofS
are key set.
Input
There are multiple test cases. The first line of input contains an integerT
(1≤T≤10
5
)
,
indicating the number of test cases. For each test case:
The first line contains an integer n
(1≤n≤10
9
)
,
the number of integers in the set.
The first line contains an integer n
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
Author
zimpha@zju
题意and题解:给出一个数n,集合S中的元素就有n个(1~n),找出S的所有非空子集中 子集元素和 为偶数的 子集个数!(不理解的多读几遍)。子集个数为2^(n-1)-1个,
怎么求呢?如果直接求肯定超时啊,这就用到了快速幂的方法了,见代码:
<span style="font-family:SimSun;font-size:18px;"><span style="font-family:SimSun;font-size:18px;">#include<cstdio>
#define M 1000000007
int main()
{
__int64 t,n;
scanf("%I64d",&t);
while(t--)
{
scanf("%I64d",&n);
__int64 ans=1,base=2;
n--;
while(n)
{
if(n&1)
{
ans=(ans*base)%M; //同余定理
}
base=(base*base)%M;
n=n/2;
}
printf("%I64d\n",ans-1);
}
}</span></span>