Advertisement
Guest User

Untitled

a guest
Jul 15th, 2019
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.70 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. int primes[10] = {0, 3, 5, 7, 11, 13, 17, 19, 23, 29};
  6. int n;
  7. int maxPow[10] = {0, 19, 13, 11, 8, 8, 7, 7, 6, 6};
  8. int powNow[10];
  9. int divisors = 1;
  10. unsigned long long minOdd = 9223372036854775807;
  11.  
  12. unsigned long long power(int base, int exponent) {
  13. unsigned long long result = 1;
  14. while (exponent) {
  15. if (exponent & 1)
  16. result *= base;
  17. base *= base;
  18. exponent /= 2;
  19. }
  20. return result;
  21. }
  22.  
  23. bool findMinOdd(int stage) {
  24. a:
  25. int divisorsHere = 1;
  26. for (int i = 1; i <= 9; i++) divisorsHere *= (powNow[i] + 1);
  27. if (divisorsHere == divisors) {
  28. unsigned long long number = 1;
  29. for (int i = 1; i <= 9; i++) {
  30. if (number < 2147483648 && number < minOdd)
  31. number *= power(primes[i], powNow[i]);
  32. else {
  33. powNow[stage] = 0;
  34. return 1;
  35. }
  36. }
  37. minOdd = min(minOdd, number);
  38. return 0;
  39. }
  40. if (divisorsHere > divisors) {
  41. powNow[stage] = 0;
  42. return 1;
  43. }
  44. while (powNow[stage] < maxPow[stage]) {
  45. powNow[stage]++;
  46. if (stage == 9)
  47. goto a;
  48. if (findMinOdd(stage + 1)) {
  49. powNow[stage] = 0;
  50. return 0;
  51. }
  52. }
  53. powNow[stage] = 0;
  54. return 0;
  55. }
  56.  
  57. int main() {
  58. cin >> n;
  59. int factor = 2;
  60. while (factor * factor <= n) {
  61. if (!(n % factor)) {
  62. int exponent = 0;
  63. do n /= factor, exponent++;
  64. while (!(n % factor));
  65. divisors *= (exponent + 1);
  66. }
  67. factor += (factor == 2 ? 1 : 2);
  68. }
  69. if (n > 1)
  70. divisors *= 2;
  71. findMinOdd(1);
  72. cout << minOdd;
  73. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement