zoukankan      html  css  js  c++  java
  • 帕秋莉·诺蕾姬 (Standard IO)

    Description

      在幻想乡,帕秋莉·诺蕾姬是以宅在图书馆闻名的魔法使。这一天帕秋莉又在考虑如何加强魔法咒语的威力。帕秋莉的魔法咒语是一个仅有大写字母组成的字符串,我们考虑从’A’到’Z’分别表示0到25的数字,于是这个魔法咒语就可以看作一个26进制数。帕秋莉通过研究发现,如果一个魔法咒语所代表的数能够整除10进制数M的话,就能够发挥最大的威力。若当前的魔法咒语并不能整除M,帕秋莉只会将其中两个字符的位置交换,尽量让它能够被M整除,当然由于某些咒语比较特殊,无论怎么改变都不能达到这个目的。请你计算出她能否只交换两个字符就让当前咒语被M整除。(首位的’A’为前导0)

    Input

      第1行:1个字符串,长度不超过L。
      第2行:1个正整数,M

    Output

      第1行:用空格隔开的2个整数,输出时先输位置靠前的那个。
      如果存在多种交换方法,输出字典序最小的,比如1 3和1 5都可以达到目的,就输出1 3;1 3和2 4都行时也输出1 3。注意字符串下标从左到右依次为1到L开始。如果初始魔法咒语已经能够整除M,输出”0 0”;若无论如何也不能到达目的输出”-1 -1”。

    题解
    先预处理出26的0至2000的次方,因为题目问是否能整除M,所以可以在预处理时mod M。然后暴力每一种交换情况,即可。

    代码

    var
      s:ansistring;
      l,n:longint;
      a,f:array [0..2001] of longint;
    procedure init;
    var
      i,j,t:longint;
    begin
      readln(s);
      readln(n);
      l:=length(s);
      a[0]:=1;
      for i:=1 to 1999 do
        a[i]:=(a[i-1]*26) mod n;
      for i:=1 to l do
        begin
          f[i]:=((ord(s[i])-65)*a[l-i]) mod n;
          f[0]:=(f[0]+f[i]) mod n;
        end;
      if f[0]=0 then
        begin
          write('0 0');
          halt;
        end;
    end;
    
    procedure main;
    var
      i,j,t,x,y:longint;
    begin
      for i:=1 to l-1 do
        begin
          x:=ord(s[i])-65;
          for j:=i+1 to l do
            begin
              y:=ord(s[j])-65;
              t:=((x-y)*a[l-j]+(y-x)*a[l-i]) mod n;
              if (f[0]+t) mod n=0 then
                begin
                  write(i,' ',j);
                  halt;
                end;
            end;
        end;
    end;
    
    begin
      init;
      main;
      write('-1 -1');
    end.
  • 相关阅读:
    Java锁---偏向锁、轻量级锁、自旋锁、重量级锁
    Java自旋锁
    设计模式的原则
    CGLIB介绍与原理(通过继承的动态代理)
    Android Messenger
    Android AIDL的用法
    长连接和短连接和推送
    Java对称加密算法
    Android 热修复技术中的CLASS_ISPREVERIFIED问题
    Java类加载器
  • 原文地址:https://www.cnblogs.com/zyx-crying/p/9319608.html
Copyright © 2011-2022 走看看