Advertisement
a53

2lap

a53
Mar 26th, 2018
153
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.20 KB | None | 0 0
  1. #include <fstream>
  2. using namespace std;
  3. int F[31];
  4.  
  5. void scrie_in_vector(int n) /// Memoreaza in vectorul de frecventa F valorile citite (exponentii)
  6. {
  7. int exp=-1;
  8. while(n)
  9. ++exp,n/=2;
  10. ++F[exp];
  11. }
  12.  
  13. int main()
  14. {
  15. int n,m;
  16. ifstream f("2lap.in");
  17. f>>n>>m;
  18. int x;
  19. while(f>>x)
  20. scrie_in_vector(x);
  21. f.close();
  22. /// Pentru pozitia lui n
  23. int i=0,pozn=1,nr=0,cate=0; /// cate- retine cate valori egale au fost numarate pana la n sau m
  24. while(pozn<=n) /// Cat timp n-am ajuns la pozitia n
  25. {
  26. nr=F[i]; /// Retinem in nr numarul de valori 2^i
  27. cate=0;
  28. while(nr&&pozn<=n) /// Cat timp inca n-am ajuns la pozitia n a numerelor
  29. ++pozn,++cate,--nr;
  30. ++i; /// Trecem la urmatorul exponent i
  31. }
  32. int pozvn=--i,plus_dupa_n=nr; /// pozvn=pozitia in vectorul F a celei de-a n-a valoare
  33. /// plus_dupa_n retine cate valori sunt dupa cea de-a n-a valoare si egale cu ea
  34. /// Pentru pozitia lui m
  35. i=0;
  36. int pozm=1;
  37. while(pozm<=m) /// Cat timp n-am ajuns la pozitia m
  38. {
  39. cate=0;
  40. nr=F[i]; /// Retinem in nr numarul de exponenti i ai lui 2
  41. while(nr&&pozm<=m) /// Cat timp inca n-am ajuns la pozitia m a numerelor
  42. ++pozm,++cate,--nr;
  43. ++i; /// Trecem la urmatorul exponent i
  44. }
  45. int pozvm=--i,plus_inainte_de_m=0; /// pozvm=pozitia in vectorul F a celei de-a m-a valoare
  46. if(cate>1)
  47. plus_inainte_de_m=F[i]-nr-1; /// retine cate valori sunt inaintea celei de-a m-a valoare si egale cu ea
  48. ofstream g("2lap.out");
  49. g<<(1<<pozvn)<<' '<<(1<<pozvm)<<'\n'; /// Cerinta 1
  50. int s=0; /// Cerinta 2
  51. if(plus_dupa_n)
  52. {
  53. if(pozvn==pozvm)
  54. s+=pozvn*(m-n-1);
  55. else
  56. s+=pozvn*plus_dupa_n;
  57. }
  58. for(int k=pozvn+1;k<pozvm;++k)
  59. s+=k*F[k];
  60. if(plus_inainte_de_m&&pozvn!=pozvm)
  61. s+=pozvm*plus_inainte_de_m;
  62. g<<s<<'\n';
  63. if(plus_dupa_n) /// Cerinta 3
  64. g<<(1<<pozvn)<<' ';
  65. for(int k=pozvn+1;k<pozvm;++k)
  66. if(F[k])
  67. g<<(1<<k)<<' ';
  68. if(plus_inainte_de_m&&pozvn!=pozvm)
  69. g<<(1<<pozvm)<<' ';
  70. g.close();
  71. return 0;
  72. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement