Cod sursa(job #778056)
#include <fstream>
#include <string.h>
#include <algorithm>
#define MAX 10005
using namespace std;
char sir[MAX];
int first[MAX], second[MAX], third[MAX];
void add(int A[], int B[])
{
int i, t = 0;
for (i=1; i<=A[0] || i<=B[0] || t; i++, t/=10)
A[i] = (t += A[i] + B[i]) % 10;
A[0] = i - 1;
}
void mul(int A[], int B)
{
int i, t = 0;
for (i = 1; i <= A[0] || t; i++, t /= 10)
A[i] = (t += A[i] * B) % 10;
A[0] = i - 1;
}
void sub(int A[], int B[])
{
int i, t = 0;
for (i = 1; i <= A[0]; i++)
{
A[i] -= ((i <= B[0]) ? B[i] : 0) + t;
A[i] += (t = A[i] < 0) * 10;
}
for (; A[0] > 1 && !A[A[0]]; A[0]--);
}
void mul(int A[], int B[])
{
int i, j, t, C[MAX];
memset(C, 0, sizeof(C));
for (i = 1; i <= A[0]; i++)
{
for (t=0, j=1; j <= B[0] || t; j++, t/=10)
C[i+j-1]=(t+=C[i+j-1]+A[i]*B[j])%10;
if (i + j - 2 > C[0]) C[0] = i + j - 2;
}
memcpy(A, C, sizeof(C));
}
void StringToVector(int *v, char *s)
{
v[0] = strlen(s);
for(int i = strlen(s) - 1, j = 1; i >= 0; i--, j++)
v[j] = s[i] - '0';
}
int main()
{
ifstream in("sarpe.in"); in.getline(sir, MAX); in.close();
int unu[5], doi[5];
unu[0] = unu[1] = 1;
doi[0] = 1; doi[1] = 2;
StringToVector(first, sir);
StringToVector(second, sir);
StringToVector(third, sir);
ofstream out("sarpe.out");
if(first[0] != 1 || first[1] != 1)
{
mul(first, 4);
sub(second, unu);
sub(third, doi);
mul(second, 2);
mul(second, third);
add(first, second);
reverse(first + 1, first + first[0] + 1);
for(int i = 1; i <= first[0]; i++)
out<<first[i];
}
else
out<<"2";
out.close();
return 0;
}