原题:https://ac.nowcoder.com/acm/contest/9033/C
题解:在子集中中找到,最小的正整数x使得 集合所包含的值中,没有权值ai使得ai=x。对于一个长度为n的序列ai,x最大为n+1,最小为1,不妨枚举x,考虑如何计算子集个数令cnt[i]为[1,x-1]中每个i出现的个数,那么选出一个连续的子集个数为,对于大于x的子集为
很显然,复杂度是O(n)的。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=5e5+10;
const int MOD=20000311;
int a[N],cnt[N];
int n;
ll pow_mod(ll a,int b){
ll ans=1;
while(b){
if(b&1) ans=ans*a%MOD;
b>>=1;a=a*a%MOD;
}
return ans;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=1;i<=n;i++){
if(a[i]<=n) cnt[a[i]]++;
}
int tot=n;
ll ans=0;
ll pre=1;
for(int i=1;i<=n+1;i++){
tot-=cnt[i];
ans+=pre*(pow_mod(2,tot))%MOD*i%MOD;
ans%=MOD;
pre*=(pow_mod(2,cnt[i])-1)%MOD; pre%=MOD;
}
printf("%lld\n",ans);
return 0;
}