http://acm.pku.edu.cn/JudgeOnline/problem?id=1090

Код:
program PKU1090;
{$I-, s-, q-, r-}

const maxn = 1000;
  maxl = 8;
  modes = 100000000;

type integer = longint;
     node = array[0..100] of integer;

var line: array[1..maxn] of integer;
    f, p, g: array[0..maxn] of node;
    n: integer;

procedure prepare;
var i: integer;
begin
  read(n);
  for i := 1 to n do read(line[i]);
end;

procedure mult(var a: node; k: integer);
var i, tmp: integer;
begin
  tmp := 0;
  for i := 1 to a[0] do begin
    a[i] := a[i] * k + tmp;
    tmp := a[i] div modes;
    a[i] := a[i] - tmp * modes;
  end;
  if tmp > 0 then begin
    inc(a[0]);
    a[a[0]] := tmp;
  end;
end;

procedure add(var a, b: node);
var i, tmp: integer;
begin
  if b[0] > a[0] then a[0] := b[0];
  tmp := 0;
  for i := 1 to a[0] do begin
    a[i] := a[i] + b[i] + tmp;
    tmp := a[i] div modes;
    a[i] := a[i] - tmp * modes;
  end;
  if tmp > 0 then begin
    inc(a[0]);
    a[a[0]] := tmp;
  end;
end;

var st: string;

procedure print(var a: node);
var i: integer;
begin
  if a[0] = 0 then writeln(0) else begin
    write(a[a[0]]);
    for i := a[0] - 1 downto 1 do begin
      str(a[i], st);
      while length(st) < maxl do st := '0' + st;
      write(st);
    end;
    writeln;
  end;
end;

procedure main;
var i: integer;
begin
  fillchar(f, sizeof(f), 0);
  fillchar(g, sizeof(g), 0);
  fillchar(p, sizeof(p), 0);
  p[0, 1] := 1; p[0, 0] := 1;
  for i := 1 to n do begin
    p[i] := p[i - 1];
    mult(p[i], 2);
    if line[i] = 1 then begin
      g[i] := f[i - 1];
      f[i] := g[i - 1];
      add(f[i], p[i - 1]);
    end else begin
      f[i] := f[i - 1];
      g[i] := g[i - 1];
      add(g[i], p[i - 1]);
    end;
  end;
  print(f[n]);
end;

begin
  prepare;
  main;
end.

Пример решения на С++

Код:
#include <iostream>
#include <string.h>
using namespace std;

const int MAXLEN=330;

void plus(char * num1,char * num2,char * result) 
{
	int i,x,y;
	y=1;
	for(i=MAXLEN-1; i >= 0; i--)
	{
x=num1[i]-'0'+num2[i]-'0'+y;
y=x/10;
x=x%10;
result[i]=x+'0';
	}
}

int main()
{
	int total; 
	char sign[1000]; 
	char change[MAXLEN+1]; 
    char temp[MAXLEN+1]; 
	char BeforeResult[2][MAXLEN+1]; 
	char AfterResult[2][MAXLEN+1]; 
	int i,j,length;
	cin >> total;
	change[MAXLEN]=BeforeResult[0][MAXLEN]=AfterResult[0][MAXLEN]
=BeforeResult[1][MAXLEN]=AfterResult[1][MAXLEN]='\0'; 
	while(cin)
	{
 for(i=0; i < MAXLEN; i++)
BeforeResult[0][i]=BeforeResult[1][i]=change[i]='0'; 
        change[MAXLEN-1]='1'; 
length=-1;
for(i=0; i < total; i++)
	   {
   cin >> sign[i];
           if(sign[i]=='1') length=i+1; 
	   }
	   if(length==-1) cout << 0 << endl; 
	   else {
	   
       if(sign[0]=='0') 
   BeforeResult[1][MAXLEN-1]='1';
	   else 
   BeforeResult[0][MAXLEN-1]='1';
       
       for(i=1; i < length; i++)
	   {
   if(sign[i]=='0')
   {
	   plus(BeforeResult[1],change,AfterResult[1]);
               strcpy(BeforeResult[1],AfterResult[1]);
   }
   else 
   {   strcpy(temp,BeforeResult[0]); 
	   plus(BeforeResult[1],change,AfterResult[0]);
	   strcpy(BeforeResult[0],AfterResult[0]);
	   strcpy(BeforeResult[1],temp);
    }
  for(j=0; j < MAXLEN; j++)
     temp[j]='0';
   plus(change,change,temp);
   strcpy(change,temp);
}
     i=0;
	 while(BeforeResult[0][i]=='0')
 i++; 
	 while(i < MAXLEN)
	 {	 cout << BeforeResult[0][i]; i++;}
	 cout << endl;
	
	   }
	 cin >> total;
  }
  return 0;
}