Advertisement
TwITe

Untitled

Jan 31st, 2018
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.11 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define ll long long
  5. #define ull unsigned long long
  6.  
  7. const int base = 10;
  8.  
  9. void print_big_num(const vector<char>& number) {
  10.     for (int i = (int) number.size() - 1; i >= 0; i--) {
  11.         cout << number[i];
  12.     }
  13.     cout << endl;
  14. }
  15.  
  16. void save_big_num(const string& s, vector<char>& a) {
  17.     for (int i = (int) s.size() - 1; i >= 0; i--) {
  18.         a.push_back(s[i]);
  19.     }
  20. }
  21.  
  22. void save_big_num(const string& s, vector<int>& a) {
  23.     for (int i = (int)s.size() - 1; i >= 0; i--) {
  24.         a.push_back(s[i] - '0');
  25.     }
  26. }
  27.  
  28. int compare_big_nums(vector<int> a, vector<int> b) {
  29.     while (a.size() > 1 && a.back() == 0)
  30.         a.pop_back();
  31.  
  32.     while (b.size() > 1 && b.back() == 0)
  33.         b.pop_back();
  34.  
  35.     if (a.size() > b.size()) return 1;
  36.     if (a.size() < b.size()) return -1;
  37.  
  38.     for (int i = (int) a.size() - 1; i >= 0; i--) {
  39.         if (a[i] - '0' > b[i] - '0') {
  40.             return 1;
  41.         }
  42.         if (a[i] - '0' < b[i] - '0') {
  43.             return -1;
  44.         }
  45.     }
  46.     return 0;
  47. }
  48.  
  49. void multiplicate_big_nums(const vector<int>& a, const vector<int>& b, vector<int>& c) { // умножение длинного на длинное
  50.     c.resize(a.size() + b.size());
  51.     for (int i = 0; i < a.size(); i++) {
  52.         int carry = 0;
  53.         for (int j = 0; j < 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.     }
  59.     while (c.size() > 1 && c.back() == 0)
  60.         c.pop_back();
  61. }
  62.  
  63. void multiplicate_big_nums(vector<int>& a, int b) { // умножение длинного на короткое
  64.     int carry = 0;
  65.     for (size_t i = 0; i < a.size() || carry; i++) {
  66.         if (i == a.size()) {
  67.             a.push_back(0);
  68.         }
  69.         long long cur = a[i] * 1ll * b + carry;
  70.         a[i] = int(cur % base);
  71.         carry = int(cur / base);
  72.     }
  73.     while (a.size() > 1 && a.back() == 0) {
  74.         a.pop_back();
  75.     }
  76. }
  77.  
  78. void add_big_nums(vector<int>& a, const vector<int>& b) {
  79.     int carry = 0;
  80.     for (size_t i = 0; i < max(a.size(), b.size()) || carry; i++) {
  81.         if (i == a.size()) {
  82.             a.push_back(0);
  83.         }
  84.         a[i] += carry + (i < b.size() ? b[i] : 0);
  85.         carry = a[i] >= base;
  86.         if (carry) a[i] -= base;
  87.     }
  88. }
  89.  
  90. void divide_long_num(vector<int>& a, ll b, int& carry) {
  91.     for (int i = (int) a.size() - 1; i >= 0; i--) {
  92.         long long cur = a[i] + carry * 1ll * base;
  93.         a[i] = int(cur / b);
  94.         carry = int(cur % b);
  95.     }
  96.     while (a.size() > 1 && a.back() == 0)
  97.         a.pop_back();
  98. }
  99.  
  100. //13 10
  101. //292CA
  102.  
  103. //13 11
  104. //292CA
  105.  
  106. void solve() {
  107.     ios::sync_with_stdio(false);
  108.     cin.tie(NULL);
  109.  
  110.     map<char, int> bin;
  111.     for (int a = 0; a < 10; a++) {
  112.         bin[a + '0'] = a;
  113.     }
  114.     int cnt = 10;
  115.     for (char a = 'A'; a <= 'Z'; a++) {
  116.         bin[a] = cnt;
  117.         cnt++;
  118.     }
  119.  
  120.     map<int, char> bin1;
  121.     char z = 'A';
  122.     for (int i = 10; i < 36; i++) {
  123.         bin1[i] = z;
  124.         z++;
  125.     }
  126.  
  127.     int a, b;
  128.     string s;
  129.     cin >> a >> b >> s;
  130.  
  131.     vector<int> v;
  132.     save_big_num(s, v);
  133.  
  134.     reverse(s.begin(), s.end());
  135.  
  136.     vector<int> ans[s.size()];
  137.  
  138.     if (a != 10) { // перевод в десятичную систему
  139.         vector<int> cur;
  140.         string curstr = to_string(a);
  141.         save_big_num(curstr, cur);
  142.         for (int i = 0; i < s.size(); i++) {
  143.             int c = bin[s[i]];
  144.  
  145.             if (i == 0) {
  146.                 string i0 = to_string(c);
  147.                 save_big_num(i0, ans[i]);
  148.                 continue;
  149.             }
  150.  
  151.             if (i > 1) {
  152.                 multiplicate_big_nums(cur, a);
  153.             }
  154.  
  155.             vector<int> res;
  156.             string resstr = to_string(c);
  157.             save_big_num(resstr, res);
  158.  
  159.             vector<int> d2;
  160.             multiplicate_big_nums(res, cur, d2);
  161.             res = d2;
  162.  
  163.             ans[i] = res;
  164.         }
  165.     }
  166.  
  167.     vector<int> res;
  168.     if (a != 10) {
  169.         res = ans[0];
  170.         for (int i = 1; i < s.size(); i++) {
  171.             add_big_nums(res, ans[i]);
  172.         }
  173.     }
  174.     else {
  175.         res = v;
  176.     }
  177.  
  178.     string divisor = to_string(b);
  179.     vector<int> div;
  180.     save_big_num(divisor, div);
  181.     vector<int> answer;
  182.     while (compare_big_nums(res, div) >= 0) {
  183.         int remainder = 0;
  184.         divide_long_num(res, b, remainder);
  185.         answer.push_back(remainder);
  186.     }
  187.     int remainder = 0;
  188.     for (int i = 0; i < res.size(); i++) {
  189.         if (i == 0) {
  190.             remainder += res[0];
  191.         }
  192.         else {
  193.             remainder += res[1] * 10;
  194.         }
  195.     }
  196.     answer.push_back(remainder);
  197.  
  198.     vector<char> convert;
  199.     for (int i = 0; i < answer.size(); i++) {
  200.         if (answer[i] >= 10) {
  201.             convert.push_back(bin1[answer[i]]);
  202.         }
  203.         else {
  204.             convert.push_back(answer[i] + '0');
  205.         }
  206.     }
  207.  
  208.     print_big_num(convert);
  209. }
  210.  
  211. int main() {
  212.     solve();
  213.     return 0;
  214. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement