Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <cstdint>
- #include <cassert>
- #include <string>
- typedef int64_t Int;
- std::pair<Int, Int> solveSlow(Int number, Int digit) {
- if (digit == number) {
- return {number+1, 1};
- }
- if (digit > number) {
- return {2, 0};
- }
- Int best_base = 2, best_count = 0;
- if (digit == 0) {
- best_base = number;
- best_count = 1;
- }
- for (Int base = std::max(Int(2), digit+1); base < number; ++base) {
- Int count = 0;
- for (Int temp = number; temp > 0 && temp % base == digit; temp /= base) {
- ++count;
- }
- if (best_count < count) {
- best_base = base;
- best_count = count;
- }
- }
- return {best_base, best_count};
- }
- std::pair<Int, Int> solve(Int number, Int digit) {
- if (digit == number) {
- return {number+1, 1};
- }
- Int best_base = 2;
- Int best_count = 0;
- if (digit == 0) {
- best_base = number;
- best_count = 1;
- }
- for (Int base = std::max(Int(2), digit+1); base < number; ++base) {
- Int sum = 1;
- Int pow = 1;
- std::vector<Int> pows{1};
- while (number - digit * sum >= 0 && (number - digit * sum) % (pow * base) == 0) {
- pow *= base;
- pows.push_back(pow);
- sum += pow;
- }
- if (pows.size() == 1u) continue;
- /*
- for (auto & it : pows) {
- std::cout << it << " ";
- }
- std::cout << std::endl;
- */
- if (best_count < (int)pows.size()-1) {
- best_base = base;
- best_count = (int)pows.size()-1;
- }
- }
- return {best_base, best_count};
- }
- void test() {
- for (Int number = 1; number <= 1000; ++number)
- for (Int digit = 0; digit <= 9; ++digit) {
- //std::cout << "number = " << number << "digit = " << digit << std::endl;
- if (solveSlow(number, digit) != solve(number, digit)) {
- std::cout << "number = " << number << ", digit = " << digit << std::endl;
- std::exit(0);
- }
- }
- std::exit(0);
- }
- int main() {
- //test();
- Int number, digit;
- std::cin >> number >> digit;
- //assert(number <= 100);
- //assert((number == 49 && digit == 1) || (number == 7 && digit == 5));
- auto answ = solve(number, digit);
- std::cout << answ.first << " " << answ.second << std::endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment