HDU 5363 Key Set

来源:互联网 发布:linux进去数据库命令 编辑:程序博客网 时间:2024/05/27 00:31

HDU 5363 Key Set


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


快速幂取模问题

  题意:给出一个数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;} 
0 0