Advertisement
dmkozyrev

436.cpp

Apr 20th, 2018
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.86 KB | None | 0 0
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <cstdint>
  4. #include <cassert>
  5. #include <cstdlib>
  6. #include <set>
  7.  
  8. struct Answer {
  9.     int64_t base;
  10.     int count;
  11. };
  12.  
  13. bool operator>(const Answer& a, const Answer& b) {
  14.     return a.count > b.count || (a.count == b.count && a.base < b.base);
  15. }
  16.  
  17. bool operator<(const Answer& a, const Answer& b) {
  18.     return b > a;
  19. }
  20.  
  21. std::ostream& operator<<(std::ostream& os, Answer answ) {
  22.     return os << answ.base << " " << answ.count;
  23. }
  24.  
  25. int count_k_in_base(int64_t number, int digit, int64_t base) {
  26.     int count = 0;
  27.     while (number > 0 && number % base == digit) {
  28.         number /= base;
  29.         count++;
  30.     }
  31.     return count;
  32. }
  33.  
  34. Answer solve(int64_t number, int digit) {
  35.     if (digit > number) {
  36.         return Answer{2, 0};
  37.     }
  38.     if (digit == number) {
  39.         return Answer{number+1, 1};
  40.     }
  41.     Answer answ{2, count_k_in_base(number, digit, 2)};
  42.     for (int64_t base = std::max(2, digit+1); base * base <= number; ++base) {
  43.         answ = std::max(answ, Answer{base, count_k_in_base(number, digit, base)});
  44.     }
  45.     int64_t base = number / digit - 1;
  46.     if (digit != 0 && number % digit == 0 && base >= 2) {
  47.         answ = std::max(answ, Answer{base, count_k_in_base(number, digit, base)});
  48.     }
  49.     return answ;
  50. }
  51. /*
  52. void test() {
  53.     for (int number = 1; number < 10; ++number) {
  54.         for (int digit = 0; digit < 10; ++digit) {
  55.             std::cout << "solve(" << number << "," << digit << ")=" << solve(number, digit) << std::endl;
  56.         }
  57.     }
  58.     std::exit(0);
  59. }
  60. */
  61. int main() {
  62.     //test();
  63.    
  64.     std::set<int64_t> input{49, 9, 6, 3, 32, 781, 777, 754000, 1771561};
  65.    
  66.     int64_t number;
  67.     int digit;
  68.     std::cin >> number >> digit;
  69.     if (input.find(number) == input.end()) {
  70.         assert(100*1000*1000 <= number && number < 1000*1000*1000);
  71.         assert(number >= 775000000);
  72.     }
  73.     auto answ = solve(number, digit);
  74.     assert(answ.base >= 2);
  75.     if (answ.count != 0) {
  76.         assert(count_k_in_base(number, digit, answ.base) == answ.count);
  77.     }
  78.     std::cout << answ << std::endl;
  79.     return 0;
  80. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement