题目:
题解:
这道题比赛的时候没看,主要还是因为对集合求所有子集和不是很了解。
看了题解才知道 sum=(2^n-1)*(集合中数的和).。
然后就很简单了,用并查集维护祖孙节点就好了。
唯一的坑点就是原始的数据可能是负数,不能直接取模需要加上mod后取模。
代码:
#include<iostream>
#include<cstdio>
using namespace std;
typedef long long LL;
const int mod=1e9+7;
const int N=1e6+5;
int a[N],pre[N],cnt[N];
LL sum[N];
inline int read()
{
int f = 1;LL x = 0;char c = getchar();
while(c < '0' || c > '9') {
if(c == '-'