Pagini recente » Cod sursa (job #2737870) | Cod sursa (job #2180854) | Cod sursa (job #1165855) | Cod sursa (job #1781978) | Cod sursa (job #1429667)
#include <cstdio>
#include <cstring>
#include <algorithm>
#define DIM 2048
using namespace std;
FILE *fin = fopen("sarpe.in" ,"r");
FILE *fout= fopen("sarpe.out","w");
int A[DIM], B[DIM], C[DIM], D[DIM], E[DIM];
char X;
inline 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] = A[0]; A[0] > 1 && A[A[0]] == 0; A[0] --);
return;
}
inline void mul(int A[], int B[]) {
int i, j, t, C[DIM];
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));
return;
}
inline 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;
return;
}
inline void SetUp() {
X = 1;
while(X != '\n') {
X = 0;
fscanf(fin, "%c", &X);
if(X != '\n')
A[++A[0]] = X - '0';
}
for(int i = 1; i <= A[0] / 2; i ++)
swap(A[i], A[A[0]-i+1]);
E[0] = E[1] = 1;
return;
}
inline void CodeExpert(){
if(A[0] == 1 && A[1] == 1) {
fprintf(fout, "2\n");
return;
}
add(B, A); add(B, A);
add(B, A); add(B, A);
sub(A, E);
memcpy(D, A, sizeof(A));
sub(D, E); mul(A, D);
E[1] += 1; mul(A, E);
add(B, A);
for(int i = B[0]; i >= 1; i --)
fprintf(fout, "%d", B[i]);
return;
}
int main(){
SetUp();
CodeExpert();
return 0;
}