Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- using namespace std;
- int primes[10] = {0, 3, 5, 7, 11, 13, 17, 19, 23, 29};
- int n;
- int maxPow[10] = {0, 19, 13, 11, 8, 8, 7, 7, 6, 6};
- int powNow[10];
- int divisors = 1;
- unsigned long long minOdd = 9223372036854775807;
- unsigned long long power(int base, int exponent) {
- unsigned long long result = 1;
- while (exponent) {
- if (exponent & 1)
- result *= base;
- base *= base;
- exponent /= 2;
- }
- return result;
- }
- bool findMinOdd(int stage) {
- a:
- int divisorsHere = 1;
- for (int i = 1; i <= 9; i++) divisorsHere *= (powNow[i] + 1);
- if (divisorsHere == divisors) {
- unsigned long long number = 1;
- for (int i = 1; i <= 9; i++) {
- if (number < 2147483648 && number < minOdd)
- number *= power(primes[i], powNow[i]);
- else {
- powNow[stage] = 0;
- return 1;
- }
- }
- minOdd = min(minOdd, number);
- return 0;
- }
- if (divisorsHere > divisors) {
- powNow[stage] = 0;
- return 1;
- }
- while (powNow[stage] < maxPow[stage]) {
- powNow[stage]++;
- if (stage == 9)
- goto a;
- if (findMinOdd(stage + 1)) {
- powNow[stage] = 0;
- return 0;
- }
- }
- powNow[stage] = 0;
- return 0;
- }
- int main() {
- cin >> n;
- int factor = 2;
- while (factor * factor <= n) {
- if (!(n % factor)) {
- int exponent = 0;
- do n /= factor, exponent++;
- while (!(n % factor));
- divisors *= (exponent + 1);
- }
- factor += (factor == 2 ? 1 : 2);
- }
- if (n > 1)
- divisors *= 2;
- findMinOdd(1);
- cout << minOdd;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement