f[n]
=0,n=0
else =f[n-1],s[n]=0
else =2^n-1,s[i]=0,1<=i<=n-1
else =f[k-1]+2^n-2^k,k为1到n-1中最后一个一位数
#include<iostream>
#include<cstring>
#include<cstdio>
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define dwn(i,a,b) for(int i=(a);i>=(b);i--)
using namespace std;
const int maxn=1010;
int maxx(int a,int b){return a<b?b:a;}
struct Bn{
int s[maxn],lon;
Bn(){
memset(s,0,sizeof(s));
lon=0;
}
void clear(){
while(lon&&s[lon]==0)lon--;
}
Bn operator + (const Bn &b)const{
Bn Ans;
Ans.lon=maxx(lon,b.lon);
rep(i,0,Ans.lon){
Ans.s[i]+=s[i]+b.s[i];
if(Ans.s[i]>=10)
Ans.s[i+1]++,
Ans.s[i]-=10;
}
Ans.lon++;
Ans.clear();
return Ans;
}
Bn operator - ( Bn &b)const{
Bn Ans=*this;
rep(i,0,Ans.lon){
Ans.s[i]-=b.s[i];
if(Ans.s[i]<0)
Ans.s[i+1]--,
Ans.s[i]+=10;
}
Ans.clear();
return Ans;
}
void coutt(){
clear();
dwn(i,lon,0)printf("%d",s[i]);
}
}f[maxn],mi2[maxn];
int n,a[maxn];
int main(){
scanf("%d",&n);
rep(i,1,n)scanf("%d",&a[i]);
mi2[0].s[0]=1;
rep(i,1,n){
mi2[i]=mi2[i-1]+mi2[i-1];
if(a[i]==0){
f[i]=f[i-1];
continue;
}
int re=-1;
dwn(j,i-1,1)
if(a[j]){re=j;break;}
if(re==-1){
f[i]=mi2[i];
f[i].s[0]--;
continue;
}
f[i]=f[re-1]+mi2[i]-mi2[re];
}
f[n].coutt();
return 0;
}
京公网安备 11010502036488号