
答案=所有情况中总共递减次数*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=+;
long long MOD=1e9+;
long long w[maxn],ans,q[maxn],sum[maxn];
int n,x; long long M(long long a,long long b)
{while(a<) {a=a+b;} a=a%b; return a;} void init()
{
q[]=q[]=; for(int i=;i<=;i++) q[i]=M(*q[i-],MOD);
sum[]=; for(int i=;i<=;i++) sum[i]=M(sum[i-]+q[i],MOD);
} int main()
{
init(); int T; scanf("%d",&T);
while(T--)
{
scanf("%d",&n); memset(w,,sizeof w); ans=;
for(int i=;i<=n;i++)
{
scanf("%d",&x);
if(i!=) ans=M(ans+sum[i-]-w[x],MOD);
w[x]=M(w[x]+q[i-],MOD),ans=ans*;
}
printf("%lld\n",M(ans,MOD));
}
return ;
}