您的位置:首页 > 其它

Key Set(HDU5363)

2016-01-29 10:48 375 查看

Key Set

[align=left]Problem Description[/align]
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.
 

[align=left]Input[/align]
There are multiple test cases. The first line of input contains an integerT(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.
 

[align=left]Output[/align]
For each test case, output the number of key sets modulo 1000000007.
 

[align=left]Sample Input[/align]

4
1
2
3
4

 

[align=left]Sample Output[/align]

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<stdio.h>

#include<string.h>

#include<math.h>

#include<algorithm>

using namespace std;

#define LL long long    //宏定义

const int mod = 1000000007;

LL ppow(LL a,LL b)

{

    LL c=1;

    while(b)

    {

        if(b%2) c=c*a%mod;

        b=b/2;

        a=a*a%mod;

    }

    return c;

}

int main()

{

    int t;

    LL n;

    scanf("%d",&t);

    while(t--)

    {

        scanf("%I64d",&n);

        printf("%I64d\n",ppow(2,n-1)-1);  //2的n-1次方

    }

    return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Key Set HDU5363