JZOJ8.18(C组)对撞机

题目:

2312年,宇宙中发现了n台巨型对撞机,这些对撞机分别用1-n的自然数标识。科学家们不知道启动这些对撞机会发生什么危险事故,所以这些机器,刚开始都是处于关闭状态。


    随着科学家们的研究发现,第i台对撞机启动是安全的,如果其他已经启动的对撞机的标识数都跟这台对撞机标志数互质。(例如假设前面启动的是j,如果i能启动,那么(I,j)互为质数,也就是(I,j)的最大公约数为1!如果两台对撞机不互为质数就启动,那么就会发生爆炸事故。


    基于前面的研究,科学家们准备做各种启动和关闭对撞机的实验,为了确保科学家的生命安全。你要设计一个远程遥控的软件。刚开始,所有的对撞机都是关闭状态。你的程序将会收到许多询问,格式为“启动/关闭第i台对撞机”。这程序应该能处理这些询问(根据收到询问的先后顺序处理)。这程序应该按照如下的格式输出处理结果。


    如果询问是”+ i”(表示第i台对撞机启动),这程序应该按照下面三种的情况之一输出结果。


1)“Success”,如果启动第i台是安全的


2)“Already on,如果第i在这个询问之前就已经启动了。


3)“Conflict with j”,如果第i台跟前面启动了的第j台冲突,就不能启动第I,如果前面有多台跟i冲突,那么只要输出其中任何一台就可以。


    如果询问是”-i”(表示关闭第i台对撞机),这程序应该按照下面两种的情况之一输出结果。


1)“Success,表示关闭第i台对撞机


2 )“ Already off ”,表示第 i 台对撞机在询问之前就已经关闭了。

分析:
一开始真的用GCD做了,结果不用想超时,后来听别人说是两个数互为质数则一定不会冲突,或者一个是质数,另一个不是上个数的倍数则两数互质。两数如果有相同质数,就冲突。具体实现可以用桶排,因为N才十万。

附上代码:

const
  maxn=100000;

var
  status,data,ooc:array [0..maxn] of longint;
  prime:array [0..maxn] of boolean;
  n,m:longint;

procedure main;
var
  i,j,k,temp,test,v:longint;
  s:shortstring;
  flag:boolean;

begin
  fillchar(prime,sizeof(prime),true);
  for i:=2 to trunc(sqrt(maxn)) do
    if prime[i] then
      for j:=2 to trunc(sqrt(maxn)) div i do
        prime[i*j]:=false;
  fillchar(status,sizeof(status),0);
  readln(n,m);
  for i:=1 to m do
    begin
      readln(s);
      val(copy(s,3,length(s)-1),temp);
      if s[1]='+' then
        begin
          if status[temp]>0 then
            writeln('Already on')
          else
            begin
              if prime[temp] then
                begin
                  if ooc[temp]=0 then
                    begin
                      v:=1;
                      data[v]:=temp;
                      flag:=true;
                      k:=temp;
                    end
                  else
                    begin
                      flag:=false;
                      test:=temp;
                    end;
                end
              else
                begin
                  v:=0;
                  k:=temp;
                  j:=2;
                  flag:=true;
                  while temp<>1 do
                    begin
                      if temp mod j=0 then
                        begin
                          if ooc[j]>0 then
                            begin
                              flag:=false;
                              test:=j;
                              break;
                            end;
                          inc(v);
                          data[v]:=j;
                          while temp mod j=0 do
                            temp:=temp div j;
                        end;
                      inc(j);
                    end;
                end;
              if flag then
                begin
                  for j:=1 to v do
                    inc(ooc[data[j]]);
                  status[k]:=k;
                  writeln('Success');
                end
              else
                begin
                  j:=0;
                  while j<=n do
                    begin
                      inc(j,test);
                      if status[j]>0 then
                        begin
                          writeln('Conflict with ',j);
                          break;
                        end;
                    end;
                end;
            end;
        end
      else
        begin
          if status[temp]=0 then
            writeln('Already off')
          else
            begin
              if prime[temp] then
                begin
                  status[temp]:=0;
                  dec(ooc[temp]);
                  writeln('Success');
                end
              else
                begin
                  status[temp]:=0;
                  j:=2;
                  while temp<>1 do
                    begin
                      if temp mod j=0 then
                        begin
                          dec(ooc[j]);
                          while temp mod j=0 do
                            temp:=temp div j;
                        end;
                      inc(j);
                    end;
                  writeln('Success');
                end;
            end;
        end;
    end;
end;

begin
  main;
end.


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
面对Hash函数领域取得的重大研究进展,Crypto 2004 会议总主席StorageTek高级研究员Jim Hughes 17 日早晨表示,此消息太重要了,因此他已筹办该会成立24年来的首次网络广播(Webcast )。Hughes在会议上宣布:“会中将提出三份探讨杂凑碰撞(hash collisions )重要的研究报告。”其中一份是王小云等几位中国研究人员的研究发现。17日晚,王小云教授在会上把他们的研究成果做了宣读。这篇由王小云、冯登国、来学嘉、于红波四人共同完成的文章,囊括了对MD5、HAVAL-128、 MD4和RIPEMD四个著名HASH算法的破译结果。在王小云教授仅公布到他们的第三个惊人成果的时候,会场上已经是掌声四起,报告不得不一度中断。报告结束后,所有与会专家对他们的突出工作报以长时的热烈掌声,有些学者甚至起立鼓掌以示他们的祝贺和敬佩。当人们掌声渐息,来学嘉教授又对文章进行了一点颇有趣味的补充说明。由于版本问题,作者在提交会议论文时使用的一常数和先行标准不同;在会议发现这一问题之后,王小云教授立即改变了那个常数,在很短的时间内就完成了新的数据分析,这段有惊无险的小插曲倒更加证明了他们论文的信服力,攻击方法的有效性,反而凸显了研究工作的成功。   会议结束时,很多专家围拢到王小云教授身边,既有简短的探讨,又有由衷的祝贺,褒誉之词不绝。包含公钥密码的主要创始人R. L. Rivest和A. Shamir在内的世界顶级的密码学专家也上前表示他们的欣喜和祝贺。   国际密码学专家对王小云教授等人的论文给予高度评价。   MD5的设计者,同时也是国际著名的公钥加密算法标准RSA的第一设计者R.Rivest在邮件中写道:“这些结果无疑给人非常深刻的印象,她应当得到我最热烈的祝贺,当然,我并不希望看到MD5就这样倒下,但人必须尊崇真理。”   Francois Grieu这样说:“王小云、冯登国、来学嘉和于红波的最新成果表明他们已经成功破译了MD4、MD5、HAVAL-128、RIPEMD-128。并且有望以更低的复杂度完成对SHA-0的攻击。一些初步的问题已经解决。他们赢得了非常热烈的掌声。”   另一位专家Greg Rose如此评价:“我刚刚听了Joux和王小云的报告,王所使用的技术能在任何初始值下用2^40次hash运算找出SHA-0的碰撞。她在报告中对四种HASH函数都给出了碰撞,她赢得了长时间的起立喝彩,(这在我印象中还是第一次)。…… 她是当今密码学界的巾帼英雄。……(王小云教授的工作)技术虽然没有公开,但结果是无庸质疑的,这种技术确实存在。…… 我坐在Ron Rivest前面,我听到他评论道:‘我们不得不做很多的重新思考了。’”

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值