Pagini recente » Cod sursa (job #636844) | Cod sursa (job #2683498) | Istoria paginii utilizator/nicolaee2 | Cod sursa (job #129478) | Cod sursa (job #1471366)
#include <cstdio>
#include <algorithm>
#include <cstring>
#define maxN 100002
using namespace std;
int n, i, v[maxN], w[maxN], x[maxN], y[maxN];
char s[maxN];
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 mulv(int A[], int B[])
{
int i, j, t, C[maxN];
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 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 read()
{
freopen("sarpe.in", "r", stdin);
gets(s); v[0] = strlen(s);
if (s[0] == '1' && v[0] == 1)
{
freopen("sarpe.out", "w", stdout);
printf("1");
exit(0);
}
}
void solve()
{
for (i = 0; i < v[0]; ++ i)
v[v[0] - i] = s[i] - '0';
memcpy(w, v, sizeof(w));
y[++ y[0]] = 1;
sub(w, y);
memcpy(x, v, sizeof(x));
mul(v, 4);
y[1] = 2;
sub(x, y);
mulv(w, x);
mul(w, 2);
add(v, w);
}
void write()
{
freopen("sarpe.out", "w", stdout);
for (i = v[0]; i >= 1; -- i)
printf("%d", v[i]);
}
int main()
{
read();
solve();
write();
return 0;
}