题目:
http://acm.hdu.edu.cn/showproblem.php?pid=5363
题意:
集合S为{1,2..n},问S有多少个子集,满足集合中数字之和为偶数
思路:
记集合S中偶数个数为even,奇数个数为odd,集合中数字之和为奇数的子集数为2^even - 2 ^ (odd-1),总数为2^n,相减即可,因为n的数字过大需要使用快速幂
代码:
#include<stdio.h>
#include<iostream>
#include<string>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<vector>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<functional>
#pragma comment(linker, "/STACK:102400000,102400000")//C++
using namespace std;
const long long MOD = 1000000007;
//return a^b%c
long long quickpower(int a, int b, int c){
long long ans = 1, pow = a;
while (b){
if (b & 1) ans = ans * pow % c;
pow = (pow*pow) % c;
b >>= 1;
}
return ans;
}
int main(){
long long n,total;
cin>>total;
while (total--){
scanf("%lld",&n);
long long even = n/2, odd = n-even;
long long ans = (((quickpower(2,n,MOD)-1) - quickpower(2,even,MOD) * quickpower(2,odd-1,MOD)) % MOD + MOD) % MOD;
printf("%lld\n",ans);
}
return 0;
}