dmkozyrev

484_temp.cpp

Apr 19th, 2018
142
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.47 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <cstdint>
  4. #include <cassert>
  5. #include <string>
  6.  
  7. typedef int64_t Int;
  8.  
  9. std::pair<Int, Int> solveSlow(Int number, Int digit) {
  10.     if (digit == number) {
  11.         return {number+1, 1};
  12.     }
  13.     if (digit > number) {
  14.         return {2, 0};
  15.     }
  16.     Int best_base = 2, best_count = 0;
  17.     if (digit == 0) {
  18.         best_base = number;
  19.         best_count = 1;
  20.     }
  21.     for (Int base = std::max(Int(2), digit+1); base < number; ++base) {
  22.         Int count = 0;
  23.         for (Int temp = number; temp > 0 && temp % base == digit; temp /= base) {
  24.             ++count;
  25.         }
  26.         if (best_count < count) {
  27.             best_base = base;
  28.             best_count = count;
  29.         }
  30.     }
  31.     return {best_base, best_count};
  32. }
  33.  
  34. std::pair<Int, Int> solve(Int number, Int digit) {
  35.     if (digit == number) {
  36.         return {number+1, 1};
  37.     }
  38.     Int best_base = 2;
  39.     Int best_count = 0;
  40.    
  41.     if (digit == 0) {
  42.         best_base = number;
  43.         best_count = 1;
  44.     }
  45.    
  46.     for (Int base = std::max(Int(2), digit+1); base < number; ++base) {
  47.         Int sum = 1;
  48.         Int pow = 1;
  49.         std::vector<Int> pows{1};
  50.         while (number - digit * sum >= 0 && (number - digit * sum) % (pow * base) == 0) {
  51.             pow *= base;
  52.             pows.push_back(pow);
  53.             sum += pow;
  54.         }
  55.         if (pows.size() == 1u) continue;
  56.         /*
  57.         for (auto & it : pows) {
  58.             std::cout << it << " ";
  59.         }
  60.         std::cout << std::endl;
  61.         */
  62.         if (best_count < (int)pows.size()-1) {
  63.             best_base = base;
  64.             best_count = (int)pows.size()-1;
  65.         }
  66.     }
  67.     return {best_base, best_count};
  68. }
  69.  
  70. void test() {
  71.     for (Int number = 1; number <= 1000; ++number)
  72.         for (Int digit = 0; digit <= 9; ++digit) {
  73.             //std::cout << "number = " << number << "digit = " << digit << std::endl;
  74.             if (solveSlow(number, digit) != solve(number, digit)) {
  75.                 std::cout << "number = " << number << ", digit = " << digit << std::endl;
  76.                 std::exit(0);
  77.             }
  78.         }
  79.     std::exit(0);
  80. }
  81.  
  82. int main() {
  83.     //test();
  84.     Int number, digit;
  85.     std::cin >> number >> digit;
  86.     //assert(number <= 100);
  87.     //assert((number == 49 && digit == 1) || (number == 7 && digit == 5));
  88.     auto answ = solve(number, digit);
  89.     std::cout << answ.first << " " << answ.second << std::endl;
  90.     return 0;
  91. }
Advertisement
Add Comment
Please, Sign In to add comment