2554. 【NOIP2011模拟9.7】帕秋莉·诺蕾姬 (Standard IO)

在幻想乡的故事中,帕秋莉·诺蕾姬试图通过仅交换魔法咒语中的两个字符来增强其威力,使其能被特定数值整除。本文探讨了如何通过算法找到这种变换的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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”。

Sample Input

PATCHOULI
16

Sample Output

4 9

【数据范围】

  对于30%的数据:1 <= L <= 10, 1 <= M <= 100
  对于50%的数据:除前面30%外,1 <= L <= 500, M = 5或25或26
对于100%的数据:1 <= L <= 2,000, 1 <= M <= 200,000

题解

先把26进制转化为10进制,每一次改变两个字符的位置变大或变小的值只需要将之前的余数改变,如果能相除就输出。
注意:
枚举26的各个次方时,根据一条奇怪的数学理论可以变成变除n,最后结果不影响。

代码

var
  f,xx:array[0..10000] of longint;
  st:ansistring;
  i,j,k,n,m,s,x,y,le,t:longint;
begin
  readln(st);
  readln(m);

  le:=length(st);
    xx[le]:=1;

  for i:=le-1 downto 1 do
    xx[i]:=(26*xx[i+1]) mod m;

  for i:=le downto 1 do
    begin
      f[le-i+1]:=ord(st[le-i+1])-65;
      t:=(t+f[le-i+1]*xx[le-i+1]) mod m;
    end;

  if t=0 then
    begin
      writeln(0,' ',0);
      halt;
    end;

  for i:=1 to le do
    for j:=1 to le do
      begin
        x:=((f[j]-f[i])*xx[i]+(f[i]-f[j])*xx[j]) mod m;
        if (x+t) mod m=0 then
          begin
            writeln(i,' ',j);
            halt;
          end;
      end;
  writeln(-1,' ',-1);
end.
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值