sgu175pascal

题目描述

phi(W)为以下编码算法的结果:

1. W的长度为1,则phi(W)=W

2. 设编码单词为W=w1w2…wNK=N/2(向下取整);

3. phi(W) = phi(wNw(N-1)…w(K+1)) + phi(wKw(K-1)…w1)

例如,phi(‘Ok’)=’kO’phi(‘abcd’)=’cdab’

你的任务是找出字母Wq在加密的单词phi(W)中的位置。

 

输入:

给出整数Nq (1<=N<=10^9 1<=q<=N)N是单词W的长度。

输出:

输出字母Wq在加密的单词phi(W)中的位置。

样例测试:

输入:

9 4

输出:

8

 

program sky;
var
   n,ans : longint;
procedure get(l,r: longint );
var
   mid : longint;
begin
   if l=r then exit;
   mid:=(r-l+1) shr 1+l-1;
   if ans<=mid then
   begin
      ans:=l+mid-ans;
      inc(ans,r-mid);
      get(r+1-(mid-l+1),r);
   end
   else
   begin
      ans:=mid+1+(r-ans);
      dec(ans,mid-l+1);
      get(l,l-1+(r-mid));
   end;
end;
begin
   read(n,ans);
   get(1,n);
   writeln(ans);
end.

毫无难度的递归模拟仅写给像我一样的细节爱出问题的盆友。

长度=r-l+1

左端点加上长度=(l-1)+(l-r+1)

右端点减去长度=(r+1)-(l-r+1)

仅写给自己吧。。

原文地址:https://www.cnblogs.com/skysun/p/2396307.html