codevs 1376 帕秋莉•诺蕾姬

codevs 1376 帕秋莉•诺蕾姬

题目描述 Description

在幻想乡,帕秋莉•诺蕾姬是以宅在图书馆闻名的魔法使。这一天帕秋莉又在考虑如何加

强魔法咒语的威力。帕秋莉的魔法咒语是一个仅有大写字母组成的字符串,我们考虑

从’A’到’Z’分别表示0到25的数字,于是这个魔法咒语就可以看作一个26进制数

。帕秋莉通过研究发现,如果一个魔法咒语所代表的数能够整除10进制数M的话,就能

够发挥最大的威力。若当前的魔法咒语并不能整除M,帕秋莉只会将其中两个字符的位

置交换,尽量让它能够被M整除,当然由于某些咒语比较特殊,无论怎么改变都不能达

到这个目的。请你计算出她能否只交换两个字符就让当前咒语被M整除。(首位

的’A’为前导0) 第1行:1个字符串,长度不超过L。 第2行:1个正整数,M 第1行:

用空格隔开的2个整数,输出时先输位置靠前的那个。 如果存在多种交换方法,输出字

典序最小的,比如1 3和1 5都可以达到目的,就输出1 3;1 3和2 4都行时也输出1 3。

注意字符串下标从左到右依次为1到L开始。如果初始魔法咒语已经能够整除M,输出”0

0”;若无论如何也不能到达目的输出”-1 -1”。 PATCHOULI 16 4 9 对于30%的数

据:1 <= L <= 10, 1 <= M <= 100 对于50%的数据:除前面30%外,1 <= L <=

500, M = 5或25或26 对于100%的数据:1 <= L <= 2,000, 1 <= M <= 200,000

这里写图片描述

输入描述 Input Description

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

输出描述 Output Description

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

样例输入 Sample Input
PATCHOULI 16

样例输出 Sample Output
4 9

数据范围及提示 Data Size & Hint

对于30%的数据:1 <= L <= 10, 1 <= M <= 100 对于50%的数据:除前面30%外,1 <= L <= 500, M = 5或25或26 对于100%的数据:1 <= L <= 2,000, 1 <= M <= 200,000

思路:直接将26进制数暴力转成10进制数的话肯定是不可行的,所以我们可以考虑每次在转化的时候就 %m,并不会影响最终答案。交换的话从小到大枚举每两个数交换一下位置,满足条件输出就好了。

题解:

#include<iostream>
#include<cstdio>
using namespace std;
int a[10005];
int main()
{
    string x;
    cin>>x;
    int l=x.length();
    int sum=0,m;
    a[l-1]=1;
    scanf("%d",&m);
    for(int i=l-1;i>=0;i--)
    {
        sum=((a[i]*(x[i]-'A')%m)+(sum%m))%m;
        a[i-1]=a[i]*26%m; 
    }
    if(sum==0)
    {
        printf("0 0");
        return 0;
    }
    for(int i=0;i<l;i++)
    {
        for(int j=i+1;j<l;j++)
        {
            if(((sum+(x[i]-'A')*(a[j]-a[i]+m))%m+(x[j]-'A')*(a[i]-a[j]+m)%m)%m==0)//加m是防止减出负数 
            {
                printf("%d %d",i+1,j+1);
                return 0;
            }
        }
    }
    printf("-1 -1");
    return 0;
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值