【国家集训队】拉拉队排练
题面
https://www.luogu.org/problem/P1659
题解
#include<cstdio> #include<iostream> #include<cstring> #define N 1000500 #define ri register int #define uLL unsigned long long using namespace std; char s0[N]; char s1[N<<1]; int n,tonj[N<<1],tono[N<<1]; int hw[N<<1]; uLL k; inline uLL pow(uLL x,int n) { uLL ret=1; for (;n;n>>=1,x=x*x%19930726) if (n&1) ret=ret*x%19930726; return ret; } int main(){ scanf("%d %llu",&n,&k); scanf("%s",s0+1); for (ri i=1;i<=2*n+1;i++) { if (i%2==1) s1[i]='#'; else s1[i]=s0[i/2]; } int mid=0,maxr=0; for (ri i=1;i<=2*n+1;i++) { if (i<=maxr) hw[i]=min(hw[2*mid-i],maxr-i); while (s1[i+hw[i]+1]==s1[i-hw[i]-1] && i+hw[i]+1<=2*n+1 && i-hw[i]-1>=1) hw[i]++; if (i+hw[i]>maxr) maxr=i+hw[i],mid=i; } for (ri i=1;i<=2*n+1;i++) { if (s1[i]=='#') tono[2]++,tono[hw[i]+1]--; else tonj[1]++,tonj[hw[i]+1]--; } for (ri i=1;i<=n;i++) tono[i]+=tono[i-1],tonj[i]+=tonj[i-1]; uLL tot=0; uLL fac=1; for (ri i=n;i>=1;i--) { if (i%2==1) { if (tot+tonj[i]>=k) { fac*=pow(i,k-tot); fac%=19930726; printf("%llu",fac); return 0; } else { tot+=tonj[i]; fac*=pow(i,tonj[i]); fac%=19930726; } } } puts("-1"); }