2020 蓝桥杯大学 B 组省赛模拟赛(一) H. 程序设计:字符串

有一个长度为 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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值