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;
}
相关文章推荐
- HDU 5363 Key Set【快速幂取模】
- 如何在PLSQL中调试PACKAGE包中的FUNCTION函数
- AES 3DES MD5 Base64区别
- iOS 禁止横屏的解决方案
- [android ndk] -android studio中编译生成so文件
- Ember入门指南——教程目录
- 好的架构是进化来的,不是设计来的
- List<KeyValuePair<int, DateTime> 用法
- Mapped Statements collection does not contain
- pandas怎样对数据进行遍历
- Cisco路由器模拟反向代理
- 安装kali linux
- navigator.userAgent.indexOf来判断浏览器类型
- Android学习路线指南
- D触发器深入详细介绍(zhuanzai)
- 解决包含已存在的php文件,但提示就是找不到的问题
- 根据iPhone6设计稿动态计算rem值
- 一个按钮提交两个Ajax请求
- 根据iPhone6设计稿动态计算rem值
- MySQL数据类型 int(M) 表示什么意思?