• Source
    1. #include <iostream>
    2. #include <cstdio>
    3. #include <string>
    4. using namespace std;
    5. const int N=1000000;
    6. int a[20];
    7. int mark[N];
    8. int ans[N];
    9. int n,m;
    10. string s;
    11. void makezero()
    12. {
    13. for(int i=0;i<=1000000;i++)
    14. a[i]=0;
    15. }
    16. void makefalse()
    17. {
    18. for(int i=0;i<=1000000;i++)
    19. mark[i]=-1;
    20. }
    21. void move()
    22. {
    23. int i;
    24. if(a[1]==1)
    25. {
    26. if(a[n]==0)
    27. a[n]=1;
    28. else
    29. a[n]=0;
    30. }
    31. int temp=a[1];
    32. for(i=1;i<n;i++)
    33. a[i]=a[i+1];
    34. if(temp==1)
    35. a[n]=0;
    36. else
    37. a[n]=1;
    38. }
    39. int tonum()
    40. {
    41. int two=1,i;
    42. int b=0;
    43. for(i=n;i>=0;i--)
    44. {
    45. b=b+two*a[i];
    46. two=two*2;
    47. }
    48. return b;
    49. }
    50. void printresult(int x)
    51. {
    52. int i;
    53. for(i=1;i<=n;i++)
    54. a[i]=0;
    55. for(i=n;i>=1;i--)
    56. {
    57. a[i]=x%2;
    58. x=x/2;
    59. }
    60. for(i=1;i<=n;i++)
    61. if(a[i]==1)
    62. cout<<'+';
    63. else
    64. cout<<'-';
    65. cout<<endl;
    66. }
    67. int main()
    68. {
    69. int i,j,k,t,b,c,d,time,rep;
    70. cin>>t;
    71. for(k=1;k<=t;k++)
    72. {
    73. makefalse();
    74. cin>>n>>m;
    75. cin>>s;
    76. a[0]=1;
    77. for(i=0;i<s.size();i++)
    78. if(s[i]=='+')
    79. a[i+1]=1;
    80. else
    81. a[i+1]=0;
    82. mark[tonum()]=1;
    83. ans[0]=tonum();
    84. ans[1]=tonum();
    85. time=1;
    86. while(1)
    87. {
    88. move();
    89. time++;
    90. b=tonum();
    91. if(mark[b]!=-1)
    92. {
    93. rep=mark[b];
    94. break;
    95. }
    96. else
    97. {
    98. ans[time]=b;
    99. mark[b]=time;
    100. }
    101. }
    102. time--;
    103. cout<<"Experiment #"<<k<<":"<<endl;
    104. for(i=1;i<=m;i++)
    105. {
    106. cin>>c;
    107. c++;
    108. if(time>=c)
    109. printresult(ans[c]);
    110. else
    111. {
    112. d=c-rep+1;
    113. d=d%(time-rep+1);
    114. if(d==0)
    115. printresult(ans[time]);
    116. else
    117. printresult(ans[d+rep-1]);
    118. }
    119. }
    120. }
    121. return 0;
    122. }
    123.  
    124.  
    125.  
    126.  
    127.  
    128.  
    129.  
    130.  
    131.  
    132.  
    133.  
    134.