Problem Description
soda has a set
S
<script id="MathJax-Element-57" type="math/tex">S</script> 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
快速幂取模问题
题意:给出一个数n,表示一个集合中有n个数1-n;找出这个集合的非空子集的个数,并且这些非空子集中所有元素相加为偶数。
大家都知道n个数的非空子集有2的n次方减1个,那么给原集合中1剔除来,剩下的集合就有2的n-1次方-1个。那么剩下的集合中所有元素相加之和为奇数的加上1就为偶数了,剩下为偶数的就不加1.所以结果就是2的n次方-1。由于这个数据非常大,就要用快速幂。
快速幂的作用:减少计算时间。在计算中就可以取摸。取摸原理假设 m=x*y;那么 m%n=((x%n)*(y%n))%n;
#include<iostream>
#include <algorithm>
#include <cstdio>
#include <string.h>
#include <cstring>
using namespace std;
const long long N = 1000000007;
typedef long long ll;
ll fun(int n, int m, int x)
{
if ( m == 0) return 1;
if (m == 1) return n%x;
ll t = fun(n, m/2, x);
t = t * t % x;
if ( m & 1)
{
t = t * n % x;
}
return t;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("1.txt","r",stdin);
#endif
int t;
long long n;
cin >> t;
while(t--)
{
cin >> n;
cout << (fun(2, n-1, N) - 1 + N)%N << endl;
}
return 0;
}