题目描述:
一摞硬币共有m枚,每一枚都是正面朝上。取下最上面的一枚硬币,将它翻面后放回原处。然后取下最上面的2枚硬币,将他们一起翻面后再放回原处。再取3枚,取4枚……直至m枚。然后再从这摞硬币最上面的一枚开始,重复刚才的做法。这样一直做下去,直到这摞硬币中的每一枚又都是正面朝上为止。例如,m为1时,翻两次即可。m为2时,翻3次即可;m为3时,翻9次即可;m为4时,翻11次即可;m为5时,翻24次即可;…;m为30时,翻899次即可;…
输 入:
仅有的一个数字是这摞硬币的枚数m,0<m<1000。
输 出:
为了使这摞硬币中的每一枚又都是正面朝上所必需翻的次数。
输入样例:
30
输出样例:
899
程 序:
program Programl;
var m:integer;
function solve (m:integer):integer;
vat i,t,d:integer;
flag:boolean;
begin
if (m=1)then
so1ve:= 2
else begin
d:=2*m+1;
t:= 2;
i:= 1;
flag:=False;
repeat
if (t=1)then
begin
solve:= i*m
flag:=True;
end
else if ( t=2*m )then
begin
solve:=i*m-1;
flag:=True;
end
else
t:= (t*2)mod d ;
i:=i+1;
until flag;
end
end;
begin
read (m);
if ((m>0) and (m<1000)) then
writeln ( solve(m) );
end.