记录编号 378122 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [国家集训队 2011] 拉拉队排练 最终得分 100
用户昵称 Gravatar哒哒哒哒哒! 是否通过 通过
代码语言 C++ 运行时间 0.354 s
提交时间 2017-03-03 06:30:03 内存使用 32.74 MiB
显示代码纯文本
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <queue>
using namespace std;
#define ll long long 
ll read(){
	ll x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
	return x*f;
}
const ll maxn=2000100;
const ll mod=19930726;
ll n,K,p[maxn],sum[maxn];
char s[maxn];
ll qk_pow(ll a,ll b){
	ll p=1;
	for(;b;b/=2,a=1ll*a*a%mod)if(b&1)p=1ll*p*a%mod;
	return p;
}
void manacher(){
	ll mx=0,id=0;
	for(ll i=1;i<=n;i++){
		p[i]=i<mx?min(mx-i,p[2*id-i]):1;
		while(s[p[i]+i]==s[i-p[i]]) p[i]++;
		if(i+p[i]>mx) mx=p[i]+i,id=i;
	}
	for(ll i=2;i<=n;i+=2) sum[p[i]-1]++;
	for(ll i=n;i>=1;i-=2) sum[i]+=sum[i+2];
	//for(ll i=n;i>=1;i-=2) sum[i]+=sum[i+2];
	//for(ll i=1;i<=n;i++) printf("%d ",sum[i] );puts("");
}
int main(){
	freopen("rehearse.in","r",stdin);freopen("rehearse.out","w",stdout);
	n=read(),K=read();
	scanf("%s",s+1);
	n=n*2+1;
	for(ll i=n;i>=1;i--)
		if(i&1) s[i]='#';
		else s[i]=s[i>>1];
	s[0]='$';
	manacher();
	//for(ll i=1;i<=n;i++) printf("%d ",sum[i]);puts("");
	ll ans=1,res=0;
	for(ll i=n;i>=1;i-=2){
		if(res+sum[i]>=K){
			ans=ans*qk_pow(i,K-res)%mod;
			res=K;
			break;
		}
		res+=sum[i];
		ans=ans*qk_pow(i,sum[i])%mod;
	}
	if(res==K)printf("%lld\n",ans);
	else printf("-1\n");
	fclose(stdin);fclose(stdout);
	return 0;
}