帕秋莉·诺蕾姬

    xiaoxiao2025-05-24  13

    Description

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

    Input

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

    Output

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

    Sample Input

    PATCHOULI 16

    Sample Output

    4 9

    DataConstraint

    Hint

    【数据范围】   对于30%的数据:1 <= L <= 10, 1 <= M <= 100   对于50%的数据:除前面30%外,1 <= L <= 500, M = 52526 对于100%的数据:1 <= L<= 2,000, 1 <= M <= 200,000

     

    分析:

    首先预处理出26的0~L次方,然后求出这个26进制数的10进制值(要取模)。然后我们枚举更换的二个位置,然后交换。它的大小变化为

    (A[j]-a[i])*26^(L-i)+(a[i]-a[j])*26^(L-j)

    当它的值与本来的值和取模后为0即为解。

     

    程序:

    var s:ansistring; m,l,t,x:int64; power,a:array [1..1001] of int64; i,j:longint; begin readln(s); readln(m); l:=length(s); a[l]:=ord(s[l])-65; power[l]:=1; t:=a[l]; for i:=l-1 downto 1 do begin a[i]:=ord(s[i])-65; power[i]:=(power[i+1]*26) mod m; t:=(t+a[i]*power[i]) mod m; end; if t=0 then begin writeln('0 0'); exit; end; for i:=1 to l-1 do for j:=i+1 to l do begin x:=((a[j]-a[i])*power[i]+(a[i]-a[j])*power[j]) mod m; if (t+x) mod m=0 then begin writeln(i,' ',j); exit; end; end; writeln('-1 -1'); end.

    转载请注明原文地址: https://ju.6miu.com/read-1299210.html
    最新回复(0)