有一个长度为 L 的字符串,每个字符是大写字母。如果我们把 AA 看做 00 ,B 看做 11 ,C 看做 22 … Z 看做 2525,那么我们就得到了一个 2626 进制的数字串。
我们可以对这个字符串做一个操作:将两个位置的字母进行交换。这样得到了一个新的数字串。
现在有一个十进制整数 M ,请判断是否可以通过做至多一次(可以不做)操作,使得得到的字符串是 M 的倍数。
输入格式
第一行一个只包含大写字母的字符串。
第二行一个整数 M 。
输出格式
如果初始串就可以,那么输出 “0 0”(不加引号)
如果通过一次操作可以,请输出交换的两个位置的标号(标号小的在前,从 11 开始)。如果有多解,输出字典序最小的。
如果做不到,那么输出 “-1 -1”(不加引号)
数据范围
字符串长度为 LL 。
对于 30% 的数据: 1001≤L≤10,1≤M≤100
对于 50% 的数据:除前面 30% 外, M = 51≤L≤500,M=5 或 2525
对于 100% 的数据: 200,0001≤L≤2,000,1≤M≤200,000
样例输入复制
NETTLE
35
样例输出复制
1 2
样例解释
交换 N 和第一个 E 。
solution:强行模拟、过了七个样例就超时了、B组省赛竟然还有这种神题
#include <bits/stdc++.h>
using namespace std;
long long res;
long long to_number(string s)
{
res = 0;
for (int i = 0, j = 1; i < s.length(); ++i, j *= 26){
res += (s[s.length() - i - 1] - 'A') * j;
}
return res;
}
int main()
{
string s, temp;
long long m;
cin >> s >> m;
if (to_number(s) % m == 0)cout << "0 0" << endl;
else{
bool flag = true;
for (int i = 0; flag && i < s.length(); ++i){
for (int j = i + 1; j < s.length(); ++j){
temp = s;
swap(temp[i], temp[j]);
if (to_number(temp) % m == 0){
cout << i + 1 << ' ' << j + 1 << endl;
flag = false;
break;
}
}
}
if (flag)cout << -1 << ' ' << -1 << endl;
}
return 0;
}