题目链接:点击打开链接
QAQ有一个序列,元素个数有 N N个。
他认为一个序列的价值的是:该序列中不同元素之和。
比如说:序列 (1,1,2,2) (1,1,2,2)价值为 3 3。
现在QAQ想知道所有子序列的价值之和。对每组测试数据,输出一个整数代表所有子序列价值之和。
结果很大,请对 (109+7) (109+7)取余。
对于第二组测试数据一共有 15 15个子序列: (10)、(10)、(10)、(8)、(10,10)、(10,10)、(10,10)、 (10)、(10)、(10)、(8)、(10,10)、(10,10)、(10,10)、 (10,8)、(10,8)、(10,8)、(10,10,8)、(10,10,8)、 (10,8)、(10,8)、(10,8)、(10,10,8)、(10,10,8)、 (10,10,8)、(10,10,10)、(10,10,10,8) (10,10,8)、(10,10,10)、(10,10,10,8)。价值之和为 204 204。
#include<cstdio> #include<algorithm> #include<cstring> #define LL long long using namespace std; const LL MOD=1e9+7; 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=1;i<=n;i++) { int x; scanf("%d",&x); mark[x]++; } LL ans=0; for(int i=1;i<1<<10;i++) { LL sum=0,cnt=1; for(int j=0;j<10;j++) { if(i&(1<<j)) { sum+=(j+1); cnt=cnt*(((1LL<<mark[j+1])-1)%MOD)%MOD; // 序列的价值 = 每个子序列的贡献相乘 } } ans=(ans+sum*cnt%MOD)%MOD; } printf("%lld\n",ans); } return 0; }