更小的字符串(数位dp,pow函数使用细节)

3752. 更小的字符串 - AcWing题库

1.此题不能用使用快速幂计算每一次的pow函数。因为此时复杂度为n2,如果使用动态规划可以使时间复杂度将为n

2.库函数中的pow函数参数是double,返回值也是double。

#include<iostream>
#include<cmath>
using namespace std;
typedef long long LL;
const int N=1e5+5,MOD=1e9+7;
int n,k;
LL p[N];
char s[N];
LL mypow(LL a,LL b){
    if(b=0)return 1;
    LL rest=1;
    while(b!=1){
        if(b%2){
            rest=(rest*a)%MOD;
            b--;
        }
        a=(a*a)%MOD;
        b/=2;
    }
    return (rest*a)%MOD;
}
int main(void){
    int T;
    scanf("%d",&T);
    for(int Case=1;Case<=T;Case++){
        scanf("%d%d",&n,&k);
        scanf("%s",s+1);
        int free=n+1>>1;
        LL res=0;
        p[0]=1;
        for(int i=1;i<=free;i++){
            p[i]=(LL)p[i-1]*k%MOD;
        }
        for(int i=1;i<=free;i++){
            res+=(LL)(s[i]-'a')*p[free-i]%MOD;
            res%=MOD;
        }
        int l=n%2?free-1:free;
        int r=free+1;
        for(int i=1;i<=l;i++){
            if(s[l-i+1]<s[r+i-1]){
                res=(res+1)%MOD;
                break;
            }else if(s[l-i+1]>s[r+i-1]){
                break;
            }
        }
        printf("Case #%d: %lld\n",Case,res);
    }
    return 0;
}
  1. 读取一个测试用例的数量T。
  2. 对每个测试用例,读取两个整数n和k,以及一个字符串s。
  3. 计算"free"的值,它等于n除以2的整数部分。
  4. 初始化一个数组p,其中p[i]等于k的i次方模MOD。
  5. 读取字符串s,并根据s中的字符和数组p计算一个结果res。
  6. 根据字符串s中的字符和其他条件,对res进行一些调整。
  7. 输出结果res。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值