题解 P7750 [COCI2013-2014#2] SLOM
fz20181223 · · 题解
我们对
一开始:
第一次:
第二次:
第三次:
第四次:
第五次:
这启示我们,变换序列是存在循环的!
经过多次尝试,我们发现,字符串长度为
此时我们可以考虑通过代码暴力算出对于长度为
此时我们有了单次循环次数,我们可以大大地减少操作的次数。而对于后续的操作,我们可以推出它从最后一次循环结束后它又做了多少次变换
根据循环的特征,在一个单次循环消耗
另附:AC 代码(不要抄!)。
#include<bits/stdc++.h>
using namespace std;
string st;int x,rd,rin;
vector<int>a;
bool check(int t){
if(t==0) return 0;
for(int i=0;i<a.size();++i){
if(a[i]!=i+1) return 0;
}
return 1;
}
int solve(int n){
a.clear();
int i;
for(i=1;i<=n;++i) a.push_back(i);
for(i=0;;++i){
// printf("%dth change:",i);
// for(int j=0;j<n;++j) printf("%d ",a[j]);
// puts("");
if(check(i)) break;
for(int j=0;j<a.size()>>1;++j){
int tmp=a.back();
a.pop_back();
a.insert(a.begin()+(j<<1|1),tmp);
}
}
// printf("change time:%d",i);
return i;
}
int main(){
scanf("%d",&x);
cin>>st;
rd=solve(st.size());
rin=x%rd;
for(int i=0;i<rd-rin;++i){
for(int j=0;j<st.size()>>1;++j){
string tmp="";
tmp+=(char)st[st.size()-1];
st.erase(st.size()-1,1);
st.insert(j<<1|1,tmp);
}
}
cout<<st;
return 0;}