RT 结构体中数组开大(1500左右)还CE
#include <bits/stdc++.h>
using namespace std;
class number {
public:
int length=1;
int a[1250]={0};
};
number on[1250],off[1250],sum;
number add,times;
number operator + (const number &x,const number &y)
{
int l=max (x.length,y.length);
number ans;
ans.length=l;
int c=0;
for (int i=1;i<=l;++i)
{
ans.a[i]=x.a[i]+y.a[i]+c;
if (ans.a[i]>=10)
{
c=1;
ans.a[i]-=10;
}
else c=0;
}
if (c)
{
ans.length++;
ans.a[ans.length]=1;
}
return ans;
}
number operator * (const number &x,const number &y)
{
number ans;
ans.length=x.length+y.length+1;
for(int i=1;i<=x.length;i++)
for(int j=1;j<=y.length;j++)
ans.a[i+j-1]+=x.a[i]*y.a[j];
for (int i=1;i<=ans.length;i++)
{
if(ans.a[i]>=10)
{
ans.a[i+1]+=ans.a[i]/10;
ans.a[i]%=10;
ans.length=max(ans.length,i+1);
}
}
return ans;
}
int light[1050];
void write (number x)
{
while (not x.a[x.length] and x.length>1)
x.length--;
for (int i=x.length;i>=1;--i)
printf ("%d",x.a[i]);
}
int main ()
{
int n;
scanf ("%d",&n);
add.a[1]=1;
times.a[1]=2;
for (int i=1;i<=n;++i)
scanf ("%d",&light[i]);
if (light[1])
{
off[1].a[1]=1;
on[1].a[1]=0;
}
else
{
off[1].a[1]=0;
on[1].a[1]=1;
}
for (int i=2;i<=n;++i)
{
if (light[i])
{
off[i]=(on[i-1]*times)+add;
for (int j=i-2;j>=1;--j)
off[i]=off[i]+(off[j]*times);
}
else
{
on[i]=(on[i-1]*times)+add;
for (int j=i-2;j>=1;--j)
on[i]=on[i]+(off[j]*times);
}
}
for (int i=1;i<=n;++i) sum=sum+off[i];
write (sum);
return 0;
}