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;
}
- 读取一个测试用例的数量T。
- 对每个测试用例,读取两个整数n和k,以及一个字符串s。
- 计算"free"的值,它等于n除以2的整数部分。
- 初始化一个数组p,其中p[i]等于k的i次方模MOD。
- 读取字符串s,并根据s中的字符和数组p计算一个结果res。
- 根据字符串s中的字符和其他条件,对res进行一些调整。
- 输出结果res。