需要考虑的是长度为2或为3的回文串。不考虑限制,第 个位置可以填 种,第 个位置可以填 种,从第 个位置开始可以填 种。
接下来考虑限制。当确定一种填法时,让每个位置的字符字典序增 ,相当于又多一种填法,增 次后复原。当限制一个位置后,相当于答案除以了 。
综上
快速幂乘出即可。
#include<cstdio>
typedef long long ll;
ll k,l,p,s,w;
ll qpow(ll a,ll b)
{
ll ret=1;
for(;b;b>>=1)
{
if(b&1)ret=ret*a%p;
a=a*a%p;
}
return ret;
}
int main()
{
//freopen("in.txt","r",stdin);
scanf("%lld%lld%lld%lld%lld",&k,&l,&p,&s,&w);k%=p;
if(s==0)
{
if(l==1)printf("%lld\n",k);
else if(l==2)printf("%lld\n",k*(k-1)%p);
else printf("%lld\n",((k*(k-1)%p)*qpow(k-2,l-2)%p));
}
else
{
if(l==1)puts("1");
else if(l==2)printf("%lld\n",k-1);
else printf("%lld\n",(k-1)*qpow(k-2,l-2)%p);
}
return 0;
}
总结
考场上没推出来不应该。之前有一道涂颜色的题推法和这个类似。