Advertisement
a53

NrDiv

a53
Oct 24th, 2017
176
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.34 KB | None | 0 0
  1. #include <iostream>
  2. using namespace std;
  3. int t[]={0, 3,5,7,11,13,17,19,23};
  4. int c[]={0,15,7,6, 4, 2, 2, 2, 2};
  5. int n,st[12],nrdiv;
  6. long long numarimpar;
  7. int d[12];
  8.  
  9. void nrdivizori()/// Calculez numarul de divizori ai lui x
  10. {
  11. int i;
  12. for(i=1;i*i<n;++i)
  13. if(n%i==0)
  14. nrdiv+=2;
  15. if(i*i==n)
  16. ++nrdiv;
  17. }
  18.  
  19. inline bool valid(int top)
  20. {
  21. d[top]=d[top-1]*(1+st[top]);
  22. if(d[top]<=nrdiv)
  23. return true;
  24. return false;
  25. }
  26.  
  27. inline int putere(int a,int k) /// Calculez p=a^k
  28. {
  29. int p=1;
  30. for(int i=1;i<=k;++i)
  31. p*=a;
  32. return p;
  33. }
  34.  
  35. inline void actualizaresolutie(int top)
  36. {
  37. long long p=1;
  38. for(int i=1;i<=top;++i)
  39. p*=putere(t[i],st[i]);
  40. numarimpar=min(numarimpar,p);
  41. }
  42.  
  43. inline void backtracking()
  44. {
  45. bool gata;
  46. int top;
  47. d[0]=1;
  48. top=1;
  49. st[top]=0;
  50. while(top>0)
  51. {
  52. gata=false;
  53. while(!gata&&st[top]<c[top])
  54. ++st[top],gata=valid(top);
  55. if(!gata)
  56. --top;
  57. else
  58. if(d[top]==nrdiv)
  59. actualizaresolutie(top);
  60. else
  61. if(top<8)
  62. st[++top]=0;
  63. }
  64. }
  65.  
  66. int main()
  67. {
  68. numarimpar=2000000000;
  69. cin>>n;
  70. nrdivizori();
  71. backtracking();
  72. cout<<numarimpar<<'\n';
  73. return 0;
  74. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement