4 1 2 3 4
0 1 3 7
题意:给你一个具有n个元素的集合S{1,2,…,n},问集合S的非空子集中元素和为偶数的非空子集有多少个。
放入出题人的解题报告
解题思路:因为集合S中的元素是从1开始的连续的自然数,所以所有元素中奇数个数与偶数个数相同,或比偶数多一个。另外我们要知道偶数+偶数=偶数,奇数+奇数=偶数,假设现在有a个偶数,b个奇数,则
根据二项式展开公式
以及二项式展开式中奇数项系数之和等于偶数项系数之和的定理
可以得到上式
最后的结果还需减去
即空集的情况,因为题目要求非空子集
所以最终结果为
由于n很大,所以计算n次方的时候需要用到快速幂,不然会TLE
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<queue> #include<math.h> #include<vector> #include<map> #include<set> #include<cmath> #include<string> #include<algorithm> #include<iostream> #define exp 1e-10 #define ll __int64 using namespace std; const int N = 50; const int inf = 1000000000; const int mod = 1000000007; void Quick_Mod(ll a, ll b, ll mod) { ll res = 1,term = a % mod; while(b) { if(b & 1) res = (res * term) % mod; term = (term * term) % mod; b >>= 1; } printf("%I64d\n",res-1); } int main() { int t,n; scanf("%d",&t); while(t--) { scanf("%d",&n); Quick_Mod(2,n-1,mod); } return 0; }菜鸟成长记