HPU 1192:Sequence(组合数+二进制选数)
2017-08-22 15:40
435 查看
Time Limit:3000MS Memory Limit:131072KB 64bit IO Format:%lld
& %llu
Submit Status Practice HPU
1192
Description
在某个夜黑月高的晚上,!!!,原谅我编不下去了
。
很美吧?放松之后,继续做题吧。
HS(Handsome)的Ocean在纸上写下$N$个整数,Ocean把它定义为$O$序列。
Ocean认为一个序列的价值的是:序列中不同元素个数。
现在他想知道$O$序列中所有子序列的价值之和。
比如说:序列$(1, 1, 2, 2)$价值为$2$,因为序列中有$1$和$2$两个不同元素。
比如序列$(1, 1, 1)$,共有$7$个子序列,$(1)、(1)、(1)、(1, 1)、(1, 1)、(1, 1)、(1, 1, 1)。$ 价值之和为$7$。
Input
第一行输入一个整数$T$,代表有$T$组测试数据。
每组数据占两行,第一行输入一个整数$N$,代表序列元素个数。
接下来一行输入$N$个整数$a_i$。
注:$1 <= T <= 10000,1 <= N <= 50,1 <= a_i <= 10。$
Output
对每组测试数据,输出一个结果代表所有子序列价值之和。由于结果会很大,请用$long\,long$(%lld)。
Sample Input
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
Sample Output
7 15 22 7864320
题目链接
思路:我的方案: 组合数+用二进制选数
/* 选数原理 比如 : num[4]={1,3,5,6} 用四个二进制数表示数组对应位选没选中 例:1001 表示选中num[0]、num[3]两个数 */
#include<cstdio> #include<cstring> int num[11];//记录每个数字出现的次数 long long sum[11];//单个数字的子序列的个数 long long quickm(long long x,long long y) { long long ans=1; while(y>0) { if(y&1) ans=ans*x; y>>=1; x*=x; } return ans; } long long solve() { long long ans=0; long long ant,temp; for(int i=1;i<(1<<10);i++)//选数 { ant=0;//记录所选数的个数 temp=1;//记录中间结果 for(int j=0;j<10;j++) { if(i&1<<j) { ant++; temp*=sum[j+1]; } } ans+=ant*temp;//价值*方案数 } return ans; } int main() { int t; scanf("%d",&t); while(t--) { int n; scanf("%d",&n); memset(sum,0,sizeof(sum)); memset(num,0,sizeof(num)); for(int i=0;i<n;i++) { int t; scanf("%d",&t); num[t]++; } for(int i=1;i<=10;i++) { sum[i]=quickm(2,num[i])-1; } printf("%lld\n",solve()); } return 0; }
相关文章推荐
- 【HPU 1192 Sequence】+ 状态压缩 +组合数学
- 【HPU 1192】: Sequence 【 状态压缩】
- HPU 1192 Sequence(状态压缩+组合数学)
- hpuoj-1192-Sequence【状态压缩】【组合数学】
- hpu_oj 1192: Sequence
- codeforces914C Travelling Salesman and Special Numbers 二进制特性+组合数学+递推
- 【bzoj 1192/P2320】<两份不同> 鬼谷子的钱袋 HNOI2006(dfs or 裸求二进制位数)
- Water Gate Management(二进制枚举组合排列模板 n个数的子集)
- HDU4810 Wall Painting(组合数学+二进制)
- Number Sequence--组合数学
- Water Gate Management(二进制枚举组合排列模板 n个数的子集)
- POJ 3252 Round Numbers (组合数,二进制)
- 二进制思想 如何通过向二进制的中来用组合表示数
- Water Gate Management(二进制枚举组合排列模板 n个数的子集)
- HDU 4675GCD of Sequence(大组合数取模 容斥原理 组合数学)
- CSUOJ 1021 组合数末尾的零 二进制
- Alice and Bob (2013山东省赛)-二进制拆分组合
- 【回溯法】实现给定二进制位数的所有组合
- Water Gate Management(二进制枚举组合排列模板 n个数的子集)
- 组合数学(UESTC 488,Rebuild the Sequence)