反素数范围不大,可以直接打表得
然后就是模拟移动的过程
我们可以用线段树优化,具体明天再说吧

 const op:array[..] of longint=(,,,,,,,,,,,,,,
                                 ,,,,,,,,
                                 ,,,,,,,
                                 ,,,,,);
      fac:array[..] of longint=(,,,,,,,,,,,,,,,,,
                                 ,,,,,,,,,,,,,
                                 ,,,,);
var tree:array[..] of longint;
    a:array[..] of longint;
    nam:array[..] of string[];
    p,k,i,w,h,n,m:longint;
    ch:char; procedure build(i,l,r:longint);
  var m:longint;
  begin
    if l=r then
      tree[i]:=
    else begin
      m:=(l+r) shr ;
      build(i*,l,m);
      build(i*+,m+,r);
      tree[i]:=tree[i*]+tree[i*+];
    end;
  end; procedure work(i,l,r:longint);
  var m:longint;
  begin
    if l=r then
      tree[i]:=
    else begin
      m:=(l+r) shr ;
      if k<=m then work(i*,l,m)
      else work(i*+,m+,r);
      tree[i]:=tree[i*]+tree[i*+]
    end;
  end; function sum(i,l,r:longint):longint;
  var m:longint;
  begin
    if (<=l) and (k>=r) then
      exit(tree[i])
    else begin
      m:=(l+r) shr ;
      sum:=;
      if m>= then sum:=sum+sum(i*,l,m);
      if k>m then sum:=sum+sum(i*+,m+,r);
    end;
  end; function ask(i,l,r:longint):longint;   
  var m:longint;
  begin
    if l=r then exit(l)
    else begin
      m:=(l+r) shr ;
      if w>tree[i*] then
      begin
        w:=w-tree[i*];
        exit(ask(i*+,m+,r));
      end
      else exit(ask(i*,l,m));
    end;
  end; begin
  while not eof do
  begin
    readln(n,k);
    for i:= downto do
      if (op[i]<=n) then
      begin
        p:=i;
        break;
      end;     m:=n;
    for i:= to n do
    begin
      nam[i]:='';
      read(ch);
      while ch<>' ' do
      begin
        nam[i]:=nam[i]+ch;
        read(ch);
      end;
      readln(a[i]);
    end;
    build(,,n);     for i:= to op[p]- do
    begin
      dec(m);
      work(,,n);
      if a[k]< then  //分类讨论,找下一个人
      begin
        w:=-a[k];
        h:=sum(,,n);
        if w<=h then
        begin
          w:=h-w+;
          k:=ask(,,n);
        end
        else begin
          w:=(w-h-) mod m+;
          w:=m-w+;
          k:=ask(,,n);
        end;
      end
      else begin
        w:=a[k];
        h:=sum(,,n);
        if w<=m-h then
        begin
          w:=w+h;
          k:=ask(,,n);
        end
        else begin
          w:=w-(m-h);
          w:=(w-) mod m+;
          k:=ask(,,n);
        end;
      end;
    end;
    writeln(nam[k],' ',fac[p]);
  end;
end.

最新文章

  1. hibernate通过xml配置文件实现表与实体的映射
  2. 基于NPOI的报表引擎——ExcelReport
  3. SSH框架整合项目(一)——搭建平台和引入依赖
  4. php判断请求类型 ajax、get还是post类型
  5. 烂泥:KVM使用NAT联网并为VM配置iptables端口转发
  6. [R语言]forecast.Arima中使用xreg报错
  7. Android LruCache(Picasso内存缓存)
  8. jce
  9. InnoSetup打包exe安装应用程序,并添加卸载图标 转
  10. MariaDB Galera Cluster 部署
  11. js的数据处理记录
  12. js即时监听文本内容
  13. Cipher(置换群)
  14. [置顶] CF 86D Powerful array 分块算法入门,n*sqrt(n)
  15. git本机服务器配置(二):TortoiseGit的安装
  16. MVC简单的增删改查
  17. VsCode 使用专用编程字体FiraCode
  18. SQL中的ALL,ANY,SOME的用法
  19. DM
  20. Lab 1-1

热门文章

  1. C#图片处理高级应用(裁剪,缩放,清晰度,水印)
  2. WisDom.Net 框架设计(五) 权限设计
  3. .net单元测试——解除依赖
  4. JAVA 相关资料
  5. ==和equals
  6. css-a:visited
  7. mac下使用自带的apache与php
  8. js操作数据库实现注册和登陆
  9. SSH整合笔记
  10. MVVM模式应用 之介绍