hpuoj-1192-Sequence【状态压缩】【组合数学】
2016-12-01 23:38
465 查看
题目链接:点击打开链接
时间限制: 3 Sec 内存限制: 128 MB
提交: 112 解决: 42
[提交][状态][讨论版]
在某个夜黑月高的晚上,!!!,原谅我编不下去了
。
很美吧?放松之后,继续做题吧。
HS(Handsome)的Ocean在纸上写下NN个整数,Ocean把它定义为OO序列。
Ocean认为一个序列的价值的是:序列中不同元素个数。
现在他想知道OO序列中所有子序列的价值之和。
比如说:序列(1,1,2,2)(1,1,2,2)价值为22,因为序列中有11和22两个不同元素。
比如序列(1,1,1)(1,1,1),共有77个子序列,(1)、(1)、(1)、(1,1)、(1,1)、(1,1)、(1,1,1)。(1)、(1)、(1)、(1,1)、(1,1)、(1,1)、(1,1,1)。价值之和为77。
第一行输入一个整数TT,代表有TT组测试数据。
每组数据占两行,第一行输入一个整数NN,代表序列元素个数。
接下来一行输入NN个整数aiai。
注:1<=T<=10000,1<=N<=50,1<=ai<=10。1<=T<=10000,1<=N<=50,1<=ai<=10。
对每组测试数据,输出一个结果代表所有子序列价值之和。由于结果会很大,请用longlonglonglong(%lld)。
思路:状态压缩,组合数学;时间复杂度 O ( 1024 * 10 ) ;
用 10 个二进制位用来表示 10 个数可能存在的状态,每一位 0 表示存在这个数, 1 表示不存在这个数。
序列的总价值 = 每个元素贡献的乘积(组合数学)* 不同元素的个数
每个元素的贡献 = 非空子集的个数(2 ^ 该元素的个数 - 1)
1192: Sequence [组合数学]
时间限制: 3 Sec 内存限制: 128 MB提交: 112 解决: 42
[提交][状态][讨论版]
题目描述
在某个夜黑月高的晚上,!!!,原谅我编不下去了。
很美吧?放松之后,继续做题吧。
HS(Handsome)的Ocean在纸上写下NN个整数,Ocean把它定义为OO序列。
Ocean认为一个序列的价值的是:序列中不同元素个数。
现在他想知道OO序列中所有子序列的价值之和。
比如说:序列(1,1,2,2)(1,1,2,2)价值为22,因为序列中有11和22两个不同元素。
比如序列(1,1,1)(1,1,1),共有77个子序列,(1)、(1)、(1)、(1,1)、(1,1)、(1,1)、(1,1,1)。(1)、(1)、(1)、(1,1)、(1,1)、(1,1)、(1,1,1)。价值之和为77。
输入
第一行输入一个整数TT,代表有TT组测试数据。每组数据占两行,第一行输入一个整数NN,代表序列元素个数。
接下来一行输入NN个整数aiai。
注:1<=T<=10000,1<=N<=50,1<=ai<=10。1<=T<=10000,1<=N<=50,1<=ai<=10。
输出
对每组测试数据,输出一个结果代表所有子序列价值之和。由于结果会很大,请用longlonglonglong(%lld)。
样例输入
4 3 1 1 1 4 1 1 1 1 4 10 10 10 8 20 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10
样例输出
7 15 22 7864320
思路:状态压缩,组合数学;时间复杂度 O ( 1024 * 10 ) ;
用 10 个二进制位用来表示 10 个数可能存在的状态,每一位 0 表示存在这个数, 1 表示不存在这个数。
序列的总价值 = 每个元素贡献的乘积(组合数学)* 不同元素的个数
每个元素的贡献 = 非空子集的个数(2 ^ 该元素的个数 - 1)
#include<cstdio> #include<algorithm> #include<cstring> #define LL long long using namespace std; int n; int mark[11]; int main() { int t; scanf("%d",&t); while(t--) { scanf("%d",&n); memset(mark,0,sizeof(mark)); for(int i=0;i<n;i++) { int x; scanf("%d",&x); mark[x]++; } LL ans=0; for(int i=1;i<(1<<10);i++) // 用二进制枚举 10个数字的每一种状态 { LL cnt=0,sum=1; for(int j=0;j<10;j++) // 状态压缩一般从编号 0开始 { if(i&(1<<j)) // 表示元素存在 { cnt++; // 不同元素的个数 sum=sum*((1LL<<mark[j+1])-1); // 集合中每个元素的贡献相乘 } } ans=ans+cnt*sum; } printf("%lld\n",ans); } return 0; }
相关文章推荐
- 【HPU 1192 Sequence】+ 状态压缩 +组合数学
- 【唯一分解定理 && 状态压缩 && 组合数学】LightOJ - 1236 Pairs Forming LCM
- hdu 3811 用状态压缩DP 解决看似组合数学的题目
- 【HPU 1192】: Sequence 【 状态压缩】
- 1516. 棋盘上的车[组合数学][状态压缩]
- POJ3920状态压缩和组合数学
- Codeforces Beta Round #85 (Div. 1 Only) C (状态压缩或是数学?)
- HPUOJ 1192 Sequence
- Number Sequence--组合数学
- BZOJ 1005 [HNOI2008] 明明的烦恼(组合数学 Purfer Sequence)
- HPU 1192:Sequence(组合数+二进制选数)
- 【hpu oj 1010 QAQ的序列价值 [数学、状态压缩]】
- 【HPUoj】Divide the pears(组合数学)
- vijos - P1286座位安排 (DP状态压缩 + 组合数 + python)
- hdu(2062)-Subset sequence 组合数学
- pku 1699 Best Sequence 状态压缩dp
- hdu 5496 Beauty of Sequence 组合数学
- HDU 5724 Chess(状态压缩+组合博弈)
- HPUOJ WitchMirror 【容斥】or 【状态压缩+容斥】
- (hdu1005)Number Sequence(组合数学)