zoukankan      html  css  js  c++  java
  • 对撞机 (Standard IO)

    Description

    在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台对撞机在询问之前就已经关闭了。

    Input

    第一行输入两个空格隔开的整数n和m(1≤n,m≤10^5)分别表示对撞机的数量和询问数。接下来m行表示询问,每行要么为“+ i”,要么为“- i”(不含引号)(1≤i≤n)

    Output

    输出m行,输出结果按照上面题目给定格式输出。

    题解
    很容易想到暴力。怎么判断两个机器冲突,就把他们的质数找出来,如果有相同质数,就冲突了。那怎么找到那个数呢?因为n小于100000,可以用桶排。把找到的那质数累加,判断桶排里是否有着这个值。输出吧。

    代码

    var
      n,m:longint;
      a,b,num:array [0..100001] of longint;
      f:array [0..100001] of boolean;
    procedure init;
    var
      i,t,j,q,k,o:longint;
      s:string;
      bo:boolean;
    begin
      fillchar(f,sizeof(f),true);
      for i:=2 to trunc(sqrt(100000)) do
        if f[i] then
          for j:=2 to trunc(sqrt(100000)) div i do
            f[i*j]:=false;
      fillchar(a,sizeof(a),0);
      readln(n,m);
      for i:=1 to m do
        begin
          readln(s);
          val(copy(s,3,length(s)-1),t);
          if s[1]='+' then
            begin
              if a[t]>0 then writeln('Already on') else
                begin
                  if f[t] then
                    begin
                      if num[t]=0 then
                        begin
                          q:=1; b[q]:=t;
                          bo:=true; k:=t;
                        end else
                        begin
                          bo:=false; o:=t;
                        end;
                    end else
                    begin
                      q:=0; k:=t;
                      j:=2; bo:=true;
                      while t<>1 do
                        begin
                          if t mod j=0 then
                            begin
                              if num[j]>0 then
                                begin
                                  bo:=false; o:=j;
                                  break;
                                end;
                              inc(q);
                              b[q]:=j;
                              while t mod j=0 do
                                t:=t div j;
                            end;
                          j:=j+1;
                        end;
                    end;
                  if bo then
                    begin
                      for j:=1 to q do
                        inc(num[b[j]]);
                      a[k]:=k;
                      writeln('Success');
                    end else
                    begin
                      j:=0;
                      while j<=n do
                        begin
                          j:=j+o;
                          if a[j]>0 then
                            begin
                              writeln('Conflict with ',j);
                              break;
                            end;
                        end;
                    end;
                end;
            end else
            begin
              if a[t]=0 then writeln('Already off') else
                begin
                  if f[t] then
                    begin
                      a[t]:=0; num[t]:=num[t]-1;
                      writeln('Success');
                    end else
                    begin
                      a[t]:=0; j:=2;
                      while t<>1 do
                        begin
                          if t mod j=0 then
                            begin
                              dec(num[j]);
                              while t mod j=0 do
                                t:=t div j;
                            end;
                          j:=j+1;
                        end;
                      writeln('Success');
                    end;
                end;
            end;
        end;
    end;
    
    begin
      init;
    end.
  • 相关阅读:
    DevExpress9.3 汉化(winform)
    关于XtraGrid的CustomUnboundColumnData事件的触发条件 (收藏)
    解决DBConCurrencyException并发冲突异常(收藏)
    Devexpress控件使用总结版本9.3
    DBConcurrencyException 极端解决方案 (收藏)
    S8500 与电脑端无法正常连接
    Devexpress 10.1.6 源代码重新编译成功(DXperience 10.1.6 重新编译)附所有需要用到的资源下载地址 (收藏)
    BugTracker
    DevExpress控件学习XtraGrid控件
    LINQ:创建IQueryable Provider<1>
  • 原文地址:https://www.cnblogs.com/zyx-crying/p/9319591.html
Copyright © 2011-2022 走看看