记录编号 235593 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [国家集训队 2011] 拉拉队排练 最终得分 100
用户昵称 Gravatar神利·代目 是否通过 通过
代码语言 C++ 运行时间 0.427 s
提交时间 2016-03-11 10:04:24 内存使用 127.22 MiB
显示代码纯文本
#include<stdio.h>
#define MOD 19930726
#define ll long long
ll m;
ll ans=1;
ll POW(ll x,ll y){
	ll an=1;
	while(y){
		if(y&1) an=an*x%MOD;
		y>>=1,x=x*x%MOD;
	}
	return an;
}
int n,c[1100000];
char ch[1100000];
struct PAM{
	int cnt,last;
	int son[1100000][26],fa[1100000],l[1100000],s[1100000];
	PAM(){cnt=1,fa[0]=fa[1]=1,l[1]=-1;}
	void add(int c,int n){
		int p=last;
		while(ch[n-l[p]-1]!=ch[n]) p=fa[p];
		if(!son[p][c]){
			int now=++cnt,k=fa[p];
			l[now]=l[p]+2;
			while(ch[n-l[k]-1]!=ch[n]) k=fa[k];
			fa[now]=son[k][c],son[p][c]=now;
		}
		last=son[p][c],++s[last];
	}
	void sol(){
		for(int i=cnt;i;--i) s[fa[i]]+=s[i];
		for(int i=cnt;i;--i) c[l[i]]+=s[i];
		for(int i=n;i;--i)
		    if(i&1){
				if(m<=c[i]){
					ans=ans*POW(i,m)%MOD;
					break;
				}else ans=ans*POW(i,c[i])%MOD,m-=c[i];
		    }
		printf("%lld\n",ans);
	}
}pam;
int main(){
	freopen("rehearse.in","r",stdin);
	freopen("rehearse.out","w",stdout);
	scanf("%d%lld",&n,&m);
	scanf("%s",ch+1);
	for(int i=1;i<=n;++i) pam.add(ch[i]-97,i);
	pam.sol();
	//while(1);
}