fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define int long long
  4.  
  5. int ans[500005];
  6.  
  7. void precomp(){
  8. for(int i = 2; i <= 500000; i++)ans[i] = 1e13;
  9. // precomp divisor
  10. vector<int> div[500005];
  11. for (int i = 3; i <= 500000; i++) {
  12. int temp = i;
  13. while(true) {
  14. temp += i;
  15. if (temp <= 500000) div[temp].push_back(i);
  16. else break;
  17. }
  18. }
  19.  
  20. ans[1] = 1;
  21. for(int i = 2; i <= 500000; i++){
  22. if(i%2==0) continue;
  23. if(i>2)ans[i] = min(ans[i], ans[i-2]+1);
  24. for (auto& j : div[i]) {
  25. ans[i] = min(ans[i], ans[j-2] + ans[i/j]);
  26. }
  27. }
  28.  
  29. for(int i = 2; i <= 500000; i++)ans[i] = (ans[i] == 1e13? -1:ans[i]);
  30. }
  31.  
  32. void fun(){
  33. int m;
  34. cin >> m;
  35. cout << ans[m] << '\n';
  36. }
  37.  
  38. main() {
  39. precomp();
  40. int t; cin >> t;
  41. while(t--)fun();
  42. }
Success #stdin #stdout 0.54s 88864KB
stdin
5
1
3
5
7
9
stdout
1
2
3
4
3