Advertisement
artemgf

К-ичные числа Версия 2

Nov 29th, 2017
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.37 KB | None | 0 0
  1. #define _USE_MATH_DEFINES
  2. #include <iostream>
  3. #include <string>
  4. #include <map>
  5. #include <set>
  6. #include <algorithm>
  7. #include <vector>
  8. #include <stdio.h>
  9. #include <cmath>
  10. #include <math.h>
  11. #include <queue>
  12. #include <stack>
  13. #include <climits>
  14. #include <deque>
  15. #include <ctime>
  16. #include <iterator>
  17.  
  18. using namespace std;
  19. const int INF = (int)(2e9);
  20.  
  21. typedef long long ll;
  22. typedef unsigned long long ull;
  23. typedef unsigned int ui;
  24.  
  25. #define mh() make_heap()
  26. #define poph() pop_heap()
  27. #define pushh() push_heap()
  28. #define sor(n) n.begin(), n.end()
  29. #define mp make_pair
  30.  
  31.  
  32. #define files freopen("secretroom.in", "rt", stdin); freopen("secretroom.out", "wt", stdout)
  33. const int base = 1000 * 1000 * 1000;
  34. typedef vector<int> lnum;
  35.  
  36. lnum sum(lnum a, lnum b)
  37. {
  38.     int carry = 0;
  39.     for (size_t i = 0; i<max(a.size(), b.size()) || carry; ++i) {
  40.         if (i == a.size())
  41.             a.push_back(0);
  42.         a[i] += carry + (i < b.size() ? b[i] : 0);
  43.         carry = a[i] >= base;
  44.         if (carry)  a[i] -= base;
  45.     }
  46.     return a;
  47. }
  48.  
  49. lnum proz(lnum a, lnum b)
  50. {
  51.     lnum c(a.size() + b.size());
  52.     for (size_t i = 0; i<a.size(); ++i)
  53.         for (int j = 0, carry = 0; j<(int)b.size() || carry; ++j) {
  54.             long long cur = c[i + j] + a[i] * 1ll * (j < (int)b.size() ? b[j] : 0) + carry;
  55.             c[i + j] = int(cur % base);
  56.             carry = int(cur / base);
  57.         }
  58.     while (c.size() > 1 && c.back() == 0)
  59.         c.pop_back();
  60.     return c;
  61. }
  62.  
  63. lnum dec(lnum a, lnum b)
  64. {
  65.     int carry = 0;
  66.     for (size_t i = 0; i<b.size() || carry; ++i) {
  67.         a[i] -= carry + (i < b.size() ? b[i] : 0);
  68.         carry = a[i] < 0;
  69.         if (carry)  a[i] += base;
  70.     }
  71.     while (a.size() > 1 && a.back() == 0)
  72.         a.pop_back();
  73.     return a;
  74. }
  75.  
  76. lnum perev(ll b)
  77. {
  78.     string s = to_string(b);
  79.     lnum a;
  80.     for (int i = (int)s.length(); i>0; i -= 9)
  81.         if (i < 9)
  82.             a.push_back(atoi(s.substr(0, i).c_str()));
  83.         else
  84.             a.push_back(atoi(s.substr(i - 9, 9).c_str()));
  85.     return a;
  86. }
  87. int main()
  88. {
  89.     ull n, k;
  90.     cin >> n >> k;
  91.     vector<lnum> dpz(n + 1);
  92.     vector<lnum> dpzn(n + 1);
  93.  
  94.     lnum K = perev(k);
  95.     lnum N = perev(n);
  96.     lnum o = dec(K, perev(1));
  97.     dpz[2] = o;
  98.     dpzn[2] = dec(proz(o,K), o);
  99.     for (int i = 3; i <= n; i++)
  100.     {
  101.         dpz[i] = dpzn[i - 1];
  102.         dpzn[i] = proz(sum(dpz[i - 1], dpzn[i - 1]),o);
  103.     }
  104.     lnum a =sum(dpz[n],dpzn[n]);
  105.     printf("%d", a.empty() ? 0 : a.back());
  106.     for (int i = (int)a.size() - 2; i >= 0; --i)
  107.         printf("%09d", a[i]);
  108.     system("pause");
  109.     return 0;
  110. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement