Advertisement
Luckytoef

descprime

Sep 30th, 2020
807
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.33 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. int a[105], sol[105], mx_steps = -1, rez[105], nr, c, n;
  4. bool P[105], used[105];
  5.  
  6. void Eratostene() { // Am facut Eratostene pana la 100.
  7.     P[0] = P[1] = 1;
  8.     for(int i = 2; i * i <= 100; ++i)
  9.         if(P[i] ==0)
  10.             for(int j = 2; i * j <= 100; ++j)
  11.                 P[i * j] = 1;
  12.     a[++c] = 2;
  13.     poz[c] = 1;
  14.     for(int i = 3; i <= 97; i+=2) // Mi-am pus toate numerele prime intr-un vector pe care o sa-l parcurg.
  15.         if(P[i] == 0)
  16.             a[++c] = i;
  17. }
  18.  
  19.  
  20. void result(int step){
  21.     if(rez[1] == 0){ // verifica daca vectorul rezultat e gol. (daca e gol, pun direct solutia in el)
  22.         for(int i = 1; i <= step - 1; ++i)
  23.             rez[i] = sol[i];
  24.     }
  25.     else {
  26.         bool ok = 1;
  27.         for(int i = 1; i <= step - 1; ++i) // verific daca e minim lexicografic
  28.             if(sol[i] > rez[i]){
  29.                 ok = 0;
  30.                 break;
  31.             }
  32.         if(ok){
  33.             for(int i = 1; i <= step - 1; ++i)
  34.                 rez[i] = sol[i];
  35.         }
  36.     }
  37. }
  38.  
  39. bool check(int step){
  40.     for(int i = 1; i < step - 1; ++i) // verific daca vectorul solutie este ordonat crescator
  41.         if(sol[i] > sol[i+1])
  42.             return 0;
  43.     return 1;
  44. }
  45.  
  46. void back(int step, int S){
  47.     if(S == n && check(step)){ // Daca suma == n si daca vectorul solutie e crescator.
  48.         nr++; // am gasit o solutie.
  49.         if(step - 1 > mx_steps){ // (maximul de pasi)
  50.             mx_steps = step - 1;
  51.             result(step);
  52.         }
  53.         else if(step - 1 == mx_steps) // daca e adevarata, verifica daca vec sol e mai mic lexicografic ca vectorul rezultat
  54.             result(step);
  55.     }
  56.     else if(S > n) // daca trec cu suma de n ies din recursie
  57.         return ;
  58.  
  59.     for(int i = 1; i <= c; ++i){
  60.         sol[step] = a[i];
  61.         if(used[a[i]] == 0){ // daca nu am mai folosit acel numar prim
  62.             used[a[i]] = 1; // il marchez ca fiind folosit
  63.             back(step + 1, S + a[i]); // intru in recursie cu el ca fiind folosit
  64.             used[a[i]] = 0; // cand ies din recursie, il fac la loc 0 ca sa l pot folosi in alte solutii.
  65.         }
  66.     }
  67. }
  68.  
  69. int main()
  70. {
  71.     Eratostene();
  72.     std::cin >> n;
  73.     back(1, 0);
  74.     std::cout  << nr << '\n';
  75.     for(int i = 1; i <= mx_steps; ++i)
  76.         std::cout << rez[i] << " ";
  77.     return 0;
  78. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement