题目大意:
N个人排成一圈,随机一个编号X,若编号为X还未踢出,则将这个人踢出,否则看编号为X % N + 1(即顺时针顺序下一个编号)的人是否存活,如果还未踢出则将他踢出,否则继续看编号(X + 1)% N +1的人,如果已被踢出看顺时针的下一个…………,以此类推,直到踢出一个人为止。重复上述操作,直到剩下K个人。
已知小S的编号是Id,问按照小S的方法来他有多少的概率可以不被踢出,成功得到看电影的机会。
题解:
这题,其实挺简单了,不用考虑ID,因为是概率,剩下I个人,淘汰的概率就是1/I,留下的概率就是i-1/i,然后直接把n-k轮留下的概率全部相乘化简就可以就可以了。
想到这一步以后,我们看数据,N那么大,乘那么多次,肯定会超时,然后我们发现,
形如 4/5*3/4*2/3这些,可以将分子跟分母相互化简,最后的答案就是K/N,所以我们就考虑以下几种情况:
①N-K>0,那么就是K/N,注意化简
②N-K=0,那么就是1/1,特判即可
③K=0,那么就是0/1,依然特判即可
这个时间复杂度就是O(1)啦!
var
n,m,i:longint;
begin
readln(n,m,i);
if m=0 then writeln('0/1')
else begin
for i:=2 to trunc(sqrt(n)) do
if (m mod i=0) and (m>=i) then
begin
while (m mod i=0) and (n mod i=0) do
begin
m:=m div i;
n:=n div i;
end;
end;
if n=m then writeln('1/1')
else writeln(m,'/',n);
end;
end.