Const
Fin = 'sqr.in';
Fout = 'sqr.out';
Type
HugeInt = Record
a: Array[1..40]Of Longint;
Len: Longint;
End;
Var
f: Array[1..80, 1..80]Of HugeInt;
c: Array[1..80]Of Longint;
i, j, k: Longint;
n, m: Longint;
ans: HugeINt;
t1, t2: Hugeint;
Function MaxNum(i, j: Longint): Longint;
Begin
If i > j Then MaxNum := i Else MaxNum := j;
End;
Function Plus1(a, b: HugeInt): HugeInt;
Var
i, j, x: Longint;
Begin
x := 0;
For i:=1 To a.Len Do
For j:=1 To b.Len Do
Begin
Plus1.a[i + j - 1] := a.a[i] * a.a[j] + x;
x := Plus1.a[i + j - 1] Div 10;
Plus1.a[i + j - 1] := Plus1.a[i + j - 1] Mod 10;
End;
i := a.Len + b.Len - 1;
Inc(Plus1.a[i], x * 10);
While Plus1.a[i] >= 10 Do
Begin
Inc(i);
Plus1.a[i] := Plus1.a[i - 1] Div 10;
Plus1.a[i - 1] := Plus1.a[i - 1] Mod 10;
End;
Plus1.Len := i;
End;
Function Plus(a, b: HugeInt): Hugeint;
Var
i, j, x: Longint;
Begin
x := 0;
j := MaxNum(a.Len, b.Len);
For i:=1 To j Do
Begin
Plus.a[i] := a.a[i] + b.a[i] + x;
x := Plus.a[i] div 10;
Plus.a[i] := Plus.a[i] Mod 10;
End;
If Plus.a[j] >= 10 Then
Begin
Plus.a[j + 1] := Plus.a[j] div 10;
Plus.a[j] := Plus.a[j] Mod 10;
Inc(j);
End;
Plus.Len := j;
End;
Function Max(a, b: HugeInt): Hugeint;
Var
i: Longint;
Begin
If a.Len > b.Len Then Max := a
Else If a.Len < b.Len Then Max := b
Else
Begin
For i:=a.Len To 1 Do
Begin
If a.a[i] > b.a[i] Then
Begin
Max := a;
Exit;
End
Else If a.a[i] < b.a[i] Then
Begin
Max := b;
Exit;
End;
End;
End;
End;
Procedure INITF;
Var
i, j: Longint;
Begin
For i:=1 To m Do
For j:=1 To n Do
f[i, j].Len := 0;
End;
Function Plus2(x, n: Longint): HugeInt;
Var
T: Hugeint;
i: Longint;
Begin
Plus2.Len := 1;
Plus2.a[1] := x;
t.a[1] := 2;
t.Len := 1;
For i:=1 To n Do
Plus2 := Plus1(t, Plus2);
End;
Function Find(a, b: Longint): HugeInt;
Begin
If a = b Then Find := Plus2(c[i], m - b + a)
Else
Begin
If f[a + 1, b].Len = 0 Then f[a + 1, b] := Find(a + 1, b);
If f[a, b - 1].Len = 0 Then f[a, b - 1] := Find(a, b - 1);
Find := Max(Plus(f[a + 1, b], Plus2(c[a], m - b + a)), Plus(f[a, b - 1], Plus2(c[b], m - b + a)))
End;
End;
Begin
Assign(Input, Fin);
Assign(Output, Fout);
Reset(Input);
Rewrite(Output);
{ReadLn(n, m);
For i:=1 To n Do
Begin
For j:=1 To m Do
Read(c[j]);
INITF;
ans := Plus(ans, Find(1, m));
End;
For i:=ans.Len To 1 Do
Write(ans.a[i]);
WriteLn;}
t1.a[1] := 8;
t2.a[1] := 8;
t1.len := 1;
t2.len := 1;
ans := Plus1(t1, t2);
For i:=ans.Len To 1 Do
Write(ans.a[i]);
Close(Output);
End.
Fin = 'sqr.in';
Fout = 'sqr.out';
Type
HugeInt = Record
a: Array[1..40]Of Longint;
Len: Longint;
End;
Var
f: Array[1..80, 1..80]Of HugeInt;
c: Array[1..80]Of Longint;
i, j, k: Longint;
n, m: Longint;
ans: HugeINt;
t1, t2: Hugeint;
Function MaxNum(i, j: Longint): Longint;
Begin
If i > j Then MaxNum := i Else MaxNum := j;
End;
Function Plus1(a, b: HugeInt): HugeInt;
Var
i, j, x: Longint;
Begin
x := 0;
For i:=1 To a.Len Do
For j:=1 To b.Len Do
Begin
Plus1.a[i + j - 1] := a.a[i] * a.a[j] + x;
x := Plus1.a[i + j - 1] Div 10;
Plus1.a[i + j - 1] := Plus1.a[i + j - 1] Mod 10;
End;
i := a.Len + b.Len - 1;
Inc(Plus1.a[i], x * 10);
While Plus1.a[i] >= 10 Do
Begin
Inc(i);
Plus1.a[i] := Plus1.a[i - 1] Div 10;
Plus1.a[i - 1] := Plus1.a[i - 1] Mod 10;
End;
Plus1.Len := i;
End;
Function Plus(a, b: HugeInt): Hugeint;
Var
i, j, x: Longint;
Begin
x := 0;
j := MaxNum(a.Len, b.Len);
For i:=1 To j Do
Begin
Plus.a[i] := a.a[i] + b.a[i] + x;
x := Plus.a[i] div 10;
Plus.a[i] := Plus.a[i] Mod 10;
End;
If Plus.a[j] >= 10 Then
Begin
Plus.a[j + 1] := Plus.a[j] div 10;
Plus.a[j] := Plus.a[j] Mod 10;
Inc(j);
End;
Plus.Len := j;
End;
Function Max(a, b: HugeInt): Hugeint;
Var
i: Longint;
Begin
If a.Len > b.Len Then Max := a
Else If a.Len < b.Len Then Max := b
Else
Begin
For i:=a.Len To 1 Do
Begin
If a.a[i] > b.a[i] Then
Begin
Max := a;
Exit;
End
Else If a.a[i] < b.a[i] Then
Begin
Max := b;
Exit;
End;
End;
End;
End;
Procedure INITF;
Var
i, j: Longint;
Begin
For i:=1 To m Do
For j:=1 To n Do
f[i, j].Len := 0;
End;
Function Plus2(x, n: Longint): HugeInt;
Var
T: Hugeint;
i: Longint;
Begin
Plus2.Len := 1;
Plus2.a[1] := x;
t.a[1] := 2;
t.Len := 1;
For i:=1 To n Do
Plus2 := Plus1(t, Plus2);
End;
Function Find(a, b: Longint): HugeInt;
Begin
If a = b Then Find := Plus2(c[i], m - b + a)
Else
Begin
If f[a + 1, b].Len = 0 Then f[a + 1, b] := Find(a + 1, b);
If f[a, b - 1].Len = 0 Then f[a, b - 1] := Find(a, b - 1);
Find := Max(Plus(f[a + 1, b], Plus2(c[a], m - b + a)), Plus(f[a, b - 1], Plus2(c[b], m - b + a)))
End;
End;
Begin
Assign(Input, Fin);
Assign(Output, Fout);
Reset(Input);
Rewrite(Output);
{ReadLn(n, m);
For i:=1 To n Do
Begin
For j:=1 To m Do
Read(c[j]);
INITF;
ans := Plus(ans, Find(1, m));
End;
For i:=ans.Len To 1 Do
Write(ans.a[i]);
WriteLn;}
t1.a[1] := 8;
t2.a[1] := 8;
t1.len := 1;
t2.len := 1;
ans := Plus1(t1, t2);
For i:=ans.Len To 1 Do
Write(ans.a[i]);
Close(Output);
End.
