a53

nests

a53
Nov 9th, 2019
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.75 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define N 1000001
  3. using namespace std;
  4. int n,i,j,k,c[N],pot_sa_scad(),cifra_maxima,numar_orbite,lungime_orbite,numar_biti;
  5. string p;
  6.  
  7. void calculeaza_orbite(int j)
  8. {
  9. if(j==0)
  10. {
  11. numar_orbite=0;
  12. return;
  13. }
  14. if(2*j==n)
  15. {
  16. numar_orbite=0;
  17. return;
  18. }
  19. numar_orbite=__gcd(n,j); /// calculeaza gcd(n,j)
  20. lungime_orbite=n/numar_orbite;
  21. if(lungime_orbite%2==0) /// daca orbitele au lungime para descompune orbitele in doua
  22. numar_orbite*=2,lungime_orbite/=2;
  23. --numar_orbite; /// orbita care incepe in 0 este prestabilita
  24. }
  25.  
  26. int pot_sa_scad()
  27. {
  28. if(numar_orbite>cifra_maxima)
  29. return 0;
  30. if(numar_orbite==cifra_maxima&&numar_biti==1)
  31. return 0;
  32. while(p[numar_orbite]=='0')
  33. p[numar_orbite++]='1',++numar_biti;
  34. p[numar_orbite]='0';
  35. --numar_biti;
  36. while(cifra_maxima>=0&&p[cifra_maxima]=='0')
  37. cifra_maxima--;
  38. ++c[0];
  39. return 1;
  40. }
  41.  
  42. int main()
  43. {
  44. cin>>n>>p;
  45. numar_biti=count(p.begin(),p.end(),'1');
  46. cifra_maxima=p.size();
  47. --cifra_maxima;
  48. reverse(p.begin(),p.end());
  49. do
  50. {
  51. calculeaza_orbite(c[0]);
  52. } while(pot_sa_scad());
  53. for(i=0;i<cifra_maxima&&p[i]=='0';++i)
  54. p[i]='1';
  55. p[i]='0';
  56. k=min(c[0],n-c[0]);
  57. while(cifra_maxima<numar_orbite)
  58. {
  59. p=p+'0';
  60. cifra_maxima++;
  61. }
  62. for(i=1,j=numar_orbite-1;j>=0;++i,--j)
  63. {
  64. int x=(i+k)%n,y=(i+n-k)%n;
  65. if(p[j]=='0')
  66. c[i]=min(x,y);
  67. else
  68. c[i]=max(x,y);
  69. }
  70. ++numar_orbite;
  71. for(;i<n;++i)
  72. j=i-numar_orbite,c[i]=(i+c[j]+n-j)%n;
  73. for(i=0;i<n;++i)
  74. cout<<c[i]<<' ';
  75. return 0;
  76. }
Add Comment
Please, Sign In to add comment