SSL P2743 看电影

来源:互联网 发布:淘宝哪家鞋子质量好 编辑:程序博客网 时间:2024/06/03 19:39

题目大意:
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.
原创粉丝点击