#include <stdio.h> #include <string.h> #define MAX 11000 void reverse(char *from, char *to); void call_mult(char *first, char *second, char *result); void call_minus(char *first, char *second, char *result); void call_add(char *first, char *second, char *result); int main() { char buf[MAX]; char res[MAX]; setvbuf(stdout, NULL, _IONBF, 0); while (scanf("%s", buf) != EOF) { if (strcmp(buf, "0") == 0) { printf("1\n"); continue; } call_mult(buf, buf, res); call_minus(res, buf, buf); call_add(buf, "2", res); printf("%s\n", res); } return 0; } void reverse(char *from, char *to) { int len = strlen(from), i; for (i = 0; i < len; i++) { to[i] = from[len - 1 - i]; } to[len] = '\0'; } void call_mult(char *first, char *second, char *result) { char F[MAX], S[MAX], Res[MAX]; int f_len, s_len, f, s, r, r_len, sum, carry; f_len = strlen(first); s_len = strlen(second); r_len = f_len + s_len; r = -1; reverse(first, F); reverse(second, S); for (f = 0; f < r_len; f++) Res[f] = '0'; Res[f] = '\0'; for (s = 0; s < s_len; s++) { for (f = 0, carry = 0; f < f_len; f++) { sum = (F[f] - '0') * (S[s] - '0') + (Res[f + s] - '0') + carry; Res[f + s] = sum % 10 + '0'; carry = sum / 10; if (f + s > r) r = f + s; } while (carry) { sum = (Res[f + s] - '0') + carry; Res[f + s] = sum % 10 + '0'; carry = sum / 10; if (f + s > r) r = f + s; f++; } } for (; r > 0 && Res[r] == '0'; r--); Res[r + 1] = '\0'; reverse(Res, result); } void call_minus(char *first, char *second, char *result) { char F[MAX], S[MAX]; int f_len, s_len, now, borrow, sum; f_len = strlen(first); s_len = strlen(second); reverse(first, F); reverse(second, S); for (now = 0, borrow = 0; now < f_len && now < s_len; now++) { sum = (F[now] - '0') - (S[now] - '0') - borrow; if (sum < 0) { borrow = 1; F[now] = sum + 10 + '0'; } else { borrow = 0; F[now] = sum + '0'; } } for (; now < f_len && borrow; now++) { sum = (F[now] - '0') - borrow; if (sum < 0) { borrow = 1; F[now] = sum + 10 + '0'; } else { borrow = 0; F[now] = sum + '0'; } } for (now = f_len - 1; now > 0 && F[now] == '0'; now--); F[now + 1] = '\0'; reverse(F, result); } void call_add(char *first, char *second, char *result) { char F[MAX], S[MAX], Res[MAX]; int f_len, s_len, now, carry, sum; f_len = strlen(first); s_len = strlen(second); reverse(first, F); reverse(second, S); for (now = 0, carry = 0; now < f_len && now < s_len; now++) { sum = (F[now] - '0') + (S[now] - '0') + carry; Res[now] = sum % 10 + '0'; carry = sum / 10; } for (; now < f_len; now++) { sum = (F[now] - '0') + carry; Res[now] = sum % 10 + '0'; carry = sum / 10; } for (; now < s_len; now++) { sum = (S[now] - '0') + carry; Res[now] = sum % 10 + '0'; carry = sum / 10; } if (carry) Res[now++] = carry + '0'; Res[now] = '\0'; reverse(Res, result); }