标签:
期望=所有情况中总共递减次数*2
放完i个和放完i-1个之间的递减次数是可以递推的。
有一部分是放完i-1个之后产生的,还有一部分是放完第i个之后新产生的。
注意减去多加的部分。
2的i次方可以打个表,然后就再开一个sum预处理2的i次方的前缀和,就可以递推了。
#include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; const int maxn=100000+10; long long MOD=1e9+7; long long w[maxn],ans,q[maxn],sum[maxn]; int n,x; long long M(long long a,long long b) {while(a<0) {a=a+b;} a=a%b; return a;} void init() { q[0]=q[1]=1; for(int i=2;i<=100000;i++) q[i]=M(2*q[i-1],MOD); sum[0]=1; for(int i=1;i<=100000;i++) sum[i]=M(sum[i-1]+q[i],MOD); } int main() { init(); int T; scanf("%d",&T); while(T--) { scanf("%d",&n); memset(w,0,sizeof w); ans=0; for(int i=1;i<=n;i++) { scanf("%d",&x); if(i!=1) ans=M(ans+sum[i-2]-w[x],MOD); w[x]=M(w[x]+q[i-1],MOD),ans=ans*2; } printf("%lld\n",M(ans,MOD)); } return 0; }
标签:
原文地址:http://www.cnblogs.com/zufezzt/p/5377164.html