Advertisement
he_obviously

long?long

Apr 14th, 2020
220
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.36 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. const int N = 300;
  6.  
  7. bool lesen (int left[], int right[]) {
  8.     int check[N];
  9.     for (int i = 0; i < N; ++i) {
  10.         check[i] = left[i];
  11.     }
  12.     for (int i = N - 1; i >= 0; --i) {
  13.         if (check[i] < 99) {
  14.             check[i] += 1;
  15.             break;
  16.         }
  17.         else {
  18.             check[i] = 0;
  19.         }
  20.     }
  21.     for (int i = 0; i < N; ++i) {
  22.         if (right[i] > check[i]) {
  23.             return true;
  24.         }
  25.         else if (right[i] < check[i]) {
  26.             return false;
  27.         }
  28.         else {
  29.  
  30.         }
  31.     }
  32.     return false;
  33. }
  34.  
  35. void get_mid(int left[], int right[], int mid[]) {
  36.     for (int i = 0; i < N; ++i) {
  37.         mid[i] = 0;
  38.     }
  39.     int dot = 0;
  40.     for (int i = N - 1; i >= 0; --i) {
  41.         mid[i] = (right[i] + left[i] + dot) % 100;
  42.         dot = (right[i] + left[i] + dot) / 100;
  43.     }
  44.     for (int i = 0; i < N; ++i) {
  45.         if (i != N - 1)
  46.             mid[i + 1] += 100 * (mid[i] % 2);
  47.         mid[i] = mid[i] / 2;
  48.     }
  49. }
  50.  
  51. int main()
  52. {
  53.     //for (int first = 2; first < 1000; ++first) {
  54.     //    for (int second = 2; second < first; ++second) {
  55.  
  56.     string a;
  57.     cin >> a;
  58.  
  59.     //vector <char> al = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
  60.  
  61.     //int t = first, k = second;
  62.  
  63.     /*while (t > 0) {
  64.         a += al[t % 10];
  65.         t /= 10;
  66.     }
  67.     reverse(a.begin(), a.end());
  68.  
  69.     while (k > 0) {
  70.         b += al[k % 10];
  71.         k /= 10;
  72.     }
  73.     reverse(b.begin(), b.end());
  74.  
  75.     //cout << first / second << " ";*/
  76.  
  77.     int left[N];
  78.     int right[N];
  79.     int mid[N];
  80.     int cur[2 * N];
  81.     int ans[2 * N];
  82.  
  83.     int f[2 * N];
  84.  
  85.     for (int i = 0; i < 2 * N; ++i) {
  86.         f[i] = 0;
  87.     }
  88.  
  89.     if ((int)a.size() % 2 == 1) {
  90.         f[2 * N - (int)a.size() / 2 - 1] = (int) (a[0] - '0');
  91.         for (int i = (int)a.size() - 1; i >= 2; i -= 2) {
  92.             f[2 * N - (int)a.size() / 2 + i / 2 - 1] = ((int)(a[i - 1] - '0') * 10 + (int)(a[i] - '0'));
  93.         }
  94.     }
  95.     else {
  96.         for (int i = (int)a.size() - 1; i >= 1; i -= 2) {
  97.             f[2 * N - (int)a.size() / 2 + i / 2] = ((int)(a[i - 1] - '0') * 10 + (int)(a[i] - '0'));
  98.         }
  99.     }
  100.  
  101.     int st = 0;
  102.  
  103.     while (f[st] == 0 && st < 2 * N) {
  104.         st += 1;
  105.     }
  106.  
  107.     if (st == 2 * N) {
  108.         cout << 0;
  109.         return 0;
  110.     }
  111.  
  112.     for (int i = 0 ; i < N; ++i) {
  113.         left[i] = 0;
  114.         right[i] = f[N + i];
  115.     }
  116.  
  117.     left[N - 1] = 1;
  118.  
  119.     while (lesen(left, right)) {
  120.         for (int i = 0; i < N; ++i) {
  121.             mid[i] = 0;
  122.         }
  123.         get_mid(left, right, mid);
  124.         for (int i = 0; i < 2 * N; ++i) {
  125.             ans[i] = 0;
  126.         }
  127.         for (int i = N - 1; i >= 0; --i) {
  128.             for (int j = 0; j < 2 * N; ++j) {
  129.                 cur[j] = 0;
  130.             }
  131.             int pr = mid[i]; int dot = 0;
  132.             if (pr == 0) {
  133.                 continue;
  134.             }
  135.             for (int j = N - 1; j >= 0; --j) {
  136.                 cur[2 * N - 1 - (N - 1 - i) - (N - 1 - j)] = (mid[j] * pr + dot) % 100;
  137.                 dot = (mid[j] * pr + dot) / 100;
  138.             }
  139.             dot = 0;
  140.             for (int j = 2 * N - 1; j >= 0; --j) {
  141.                 int x = (ans[j] + cur[j] + dot) / 100;
  142.                 ans[j] = (ans[j] + cur[j] + dot) % 100;
  143.                 dot = x;
  144.             }
  145.         }
  146.         bool great = false;
  147.         for (int i = 0; i < 2 * N; ++i) {
  148.             if (ans[i] > f[i]) {
  149.                 great = true;
  150.                 break;
  151.             }
  152.             else if (ans[i] < f[i]){
  153.                 break;
  154.             }
  155.         }
  156.         if (great) {
  157.             for (int i = 0; i < N; ++i) {
  158.                 right[i] = mid[i];
  159.             }
  160.         }
  161.         else {
  162.             for (int i = 0; i < N; ++i) {
  163.                 left[i] = mid[i];
  164.             }
  165.         }
  166.     }
  167.  
  168.     for (int i = 0; i < 2 * N; ++i) {
  169.             ans[i] = 0;
  170.     }
  171.     for (int i = N - 1; i >= 0; --i) {
  172.         for (int j = 0; j < 2 * N; ++j) {
  173.             cur[j] = 0;
  174.         }
  175.         int pr = left[i]; int dot = 0;
  176.         if (pr == 0) {
  177.             continue;
  178.         }
  179.         for (int j = N - 1; j >= 0; --j) {
  180.             cur[2 * N - 1 - (N - 1 - i) - (N - 1 - j)] = (left[j] * pr + dot) % 100;
  181.             dot = (left[j] * pr + dot) / 100;
  182.         }
  183.         dot = 0;
  184.         for (int j = 2 * N - 1; j >= 0; --j) {
  185.             int x = (ans[j] + cur[j] + dot) / 100;
  186.             ans[j] = (ans[j] + cur[j] + dot) % 100;
  187.             dot = x;
  188.         }
  189.     }
  190.  
  191.     for(int j = 0; j < 2 * N; ++j) {
  192.         if (ans[j] != f[j]) {
  193.             cout << -1 << "\n";
  194.             return 0;
  195.         }
  196.     }
  197.  
  198.     bool flag = true;
  199.  
  200.     int anss = 0;
  201.  
  202.     for (int i = 0; i < N; ++i) {
  203.         if (left[i] == 0 && flag) {
  204.             continue;
  205.         }
  206.         else if (left[i] != 0 && flag) {
  207.             cout << left[i];
  208.             //anss *= 10; anss += left[i];
  209.             flag = false;
  210.         }
  211.         else {
  212.             if (left[i] < 10) {
  213.                 cout << 0;
  214.             }
  215.             //anss *= 10; anss += left[i];
  216.             cout << left[i];
  217.         }
  218.     }
  219.  
  220.     cout << "\n";
  221.     /*if (first / second != anss) {
  222.         cout << first << " " << second << " " << anss << "\n";
  223.     }
  224.     //cout << "\n";
  225.  
  226.     }
  227.     }*/
  228.  
  229.  
  230.     return 0;
  231. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement