:题目链接
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 2000 + 117;
char s[MAXN];
int len;
int a[MAXN];
int fact[MAXN];
int M;
int num, now;
void sub(int mul, int order) {//这里的操作是把a[i]删除
int sum = fact[order];
sum = sum * mul % M;
now = ((now - sum) % M + M) % M;//减去sum在加M是为了防止负数出现
}
void add(int mul, int order) {
int sum = fact[order];
sum = sum * mul % M;
now = (now + sum) % M;
}
void init() {//预处理幂次
scanf("%s", s);
scanf("%d", &M);
fact[0] = 1;
for(int i = 1; i < MAXN; i++) fact[i] = fact[i - 1] * 26 % M;//fact的作用是选择某一个位置如个位 十位
len = strlen(s);
for(int i = 0; i < len; i++) {
a[i] = s[i] - 'A';
num = (num * 26 + a[i]) % M;
}
}
int main() {
init();
if(num == 0) puts("0 0");
else {
bool pr = false;
for(int i = 0; i < len && !pr; i++) {
for(int j = 0; j < len && !pr; j++) {
now = num;
sub(a[i], len - 1 - i);//这里选择两个位置先减去在换位置相加
sub(a[j], len - 1 - j);
add(a[i], len - 1 - j);
add(a[j], len - 1 - i);
if(now == 0) {
printf("%d %d\n", i + 1, j + 1);//不要忘了加一
pr = true;
}
}
}
if(!pr) puts("-1 -1");
}
return 0;
}
来源:CSDN
作者:fisht ank
链接:https://blog.csdn.net/weixin_43305294/article/details/104338293