计蒜客蓝桥杯模拟:字符串
题目描述:
有一个长度为 $L$ 的字符串,每个字符是大写字母。如果我们把 $A$ 看做 $0$ ,$B$ 看做 $1$ ,$C$ 看做 $2$ … $Z$ 看做 $25$,那么我们就得到了一个 $26$ 进制的数字串。
我们可以对这个字符串做一个操作:将两个位置的字母进行交换。这样得到了一个新的数字串。
现在有一个十进制整数 $M$ ,请判断是否可以通过做至多一次(可以不做)操作,使得得到的字符串是 $M$ 的倍数。
输出格式
:
第一行一个只包含大写字母的字符串。
第二行一个整数 $M$.
输出格式
:
如果初始串就可以,那么输出 “0 0”(不加引号)
如果通过一次操作可以,请输出交换的两个位置的标号(标号小的在前,从 $1$ 开始)。如果有多解,输出字典序最小的。
如果做不到,那么输出 “-1 -1”(不加引号)
数据范围
字符串长度为$L$.
对于30%的数据:$1 \le L \ge 10$,$1 \le M \ge 100$
对于50%的数据:除前面30%外,$1 \le L \ge 500$,$M = 5$或$25$或$260$
对于100%的数据:$1 \le L \ge 2000,1 \le M \ge 200,000$
样例输入:
NETTLE
35
样例输出:
1 2
样例解释:
交换$N$和第一个$E$。
分析:
此题一看就是模拟题,但要注意数据范围以及运算时间的问题,如果使用pow()函数的话不仅会超时,而且由于pow返回的是double类型的值会导致运算出错。因此使用一个数组在一开始就存储26的次方结果。同时此题还有一个坑就是字典序指的是标号的字典序而不是字符串的字典序。
在求sum的时候只需将交换的两个值在不同位置的值求出来,将现在的两值之和减去原来的两值之和再加上sum,即为交换后的结果。
此题为了防止值超出范围还应活用mod。
关于mod的运算规则有如下几种:
$(a + b)$ % $p=(a $% $p + b $%$ p) $%$ p $
$(a - b) $% $p=(a $% $p - b $%$ p) $% $p$
$(a \times b)$ % $p=(a $% $p \times b $%$ p) $% $p$
$(a \div b)$ % $p=(a $% $p \div b $%$ p) $% $p$
为了防止出现负数一般对结果使用:
$ans = (ans$ % $\bmod$ $+$ $\bmod)$ % $\bmod$
代码:
1 |
|