只能帮你到这了。。。
弄了一个上午,终于a了
···cpp
```cpp
#include<cstdio>
#include<algorithm>
using namespace std;
const int mod=19930726;
char s[1000010],now[2000010];
long long n,t,R,pos,ans=1,k,p[2000010],cnt[1000010];
long long quick_pow(int x,int n){
long long ans=1,t=x;
if(x==1)return 1;
while(n){
if(n&1)
ans=(ans*t)%mod;
t=(t*t)%mod;
n>>=1;
}
return ans;
```
}//你的 quick\_pow不能这么写
```cpp
int main(){
scanf("%lld%lld%s",&n,&k,s+1);
t=n;//不能直接用n,输出时要用
for(int i=1;i<=t;i++){
now[2*i-1]='#';
now[2*i]=s[i];
}
//now[0]='$';不能有这句
now[t=2*t+1]='#';//初始化会更方便
for(int i=1;i<=t;i++){
p[i]=i<R?min(p[(pos<<1)-i],R-i):1;
while(p[i]+i<=t&&i-p[i]>=1&&now[i+p[i]]==now[i-p[i]])//在这加头尾判断
p[i]++;
if(i+p[i]>R){
pos=i;
R=i+p[i];
}
if((p[i]-1)%2) cnt[p[i]-1]++;//这里改一下
}
long long sum=0;
for(int i=n;i>=1;i--){//用倒序替代优先队列
if(i%2==0) continue;
sum+=cnt[i];
if(k>=sum){
ans=(ans*quick_pow(i,sum))%mod;
k-=sum;
}
else{
ans=(ans*quick_pow(i,k))%mod;
k-=sum;
break;
}
}
k>0?puts("-1"):printf("%lld",ans);
return 0;
}
···
```
by 小兔宝宝 @ 2018-01-24 11:15:36
orz
by ezoiHQM @ 2018-01-24 12:16:25
@[小兔宝宝](/space/show?uid=84556) orz!灰名巨佬!比我强100倍的大佬!
by _Aehnuwx @ 2018-01-24 13:11:31
...
by 小兔宝宝 @ 2018-01-24 13:20:35