Advertisement
Guest User

Untitled

a guest
Apr 18th, 2021
36
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.37 KB | None | 0 0
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. typedef long long lint;
  5. lint p[15]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47};
  6. lint answer, cntForAnswer;
  7. lint N;
  8.  
  9. /*
  10. index - индекс простого числа p[index], на который сейчас будем пробовать умножать
  11. lastA - значение предыдущего значения ai, что бы составить не возрастающую (a[i+1]<=a[i])
  12. value - текущее значение (p1^a1)*(p2^a2)*...*(pi^ai)
  13. cntForValue - количество делителей числа value
  14. */
  15. void findMax(int index, int lastA, lint value, lint cntForValue)
  16. {
  17. if (cntForValue > cntForAnswer || (cntForValue == cntForAnswer && value < answer))
  18. {
  19. answer = value;
  20. cntForAnswer = cntForValue;
  21. }
  22. if(index == 15) return;
  23. for(int a = 1; a <= lastA; a++)
  24. {
  25. lint temp = value * p[index];
  26. // проверка на переполнение
  27. if(temp/p[index] != value) return;
  28. // если получили число больше N
  29. if(temp > N) break;
  30. value = temp;
  31. findMax(index+1, a, value, cntForValue*(a+1));
  32. }
  33. }
  34.  
  35. int main()
  36. {
  37. cin >> N;
  38. findMax(0, 64, 1, 1);
  39. cout << "Answer: " << answer << endl;
  40. cout << "Count: " << cntForAnswer << endl;
  41. return 0;
  42. }
  43.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement