---恢复内容开始---
Lucky Transformation
http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2538
Time Limit: 1000MS Memory limit: 65536K
题目描述
ZYJ非常喜欢幸运数字4,和7,他认为只要是只含有4和7的数字就是幸运的。比如,4,47,4477,7都是幸运的,427就不是。 现在有一个n位没有前导零的数字d,从最高位认为是第一位。ZYJ想看看这个数字能否经得起变化.如果这个数字里面有一个连着的“47”,那么就做这样的操作:如果4的位数是奇数,那么就把47变成44,如果是偶数,那么就把47变成77。而且ZYJ闲着没事想做K次操作,每次只改变一个4所在位数最小的47.但是他再出门买食物的时候不小心用门把脑袋夹了,各位大神你可以帮ZYJ完成这个神圣而光荣的任务吗?(如果执行到m次后没有发现47,那么就直接输出m次以后的结果)
输入
第一行输入两个数nandk(1 ≤ n ≤ 105, 0 ≤ k ≤ 109)分别代表位数和执行次数。第二行输入这个数。
输出
输入操作后的结果。
示例输入
7 4 4727447
示例输出
4427477
2538 #include<iostream> #include<cstdio> #include<map> #include<cstring> using namespace std; string num; int n,k; string change(string str){ int i,len=str.length(); for(i=0;i<len;i++) if(i+1<len && str[i]=='4' && str[i+1]=='7'){ if((i+1)%2==1) str[i+1]='4'; else str[i]='7'; break; } return str; } int main(){ while(scanf("%d%d",&n,&k)!=EOF){ map<string,int> mp; cin>>num; mp[num]++; int flag=1; for(int i=1;i<=k;i++){ num=change(num); if(flag && mp[num]){ //只寻找第一个周期的相应数字 k=k%i; i=0; flag=0; } mp[num]++; } cout<<num<<endl; } return 0; }