题目链接
【题解】洛谷P4925[【LGR-053】洛谷10月月赛I]B.[1007]Scarlet的字符串不可能这么可爱 快速幂
【题解】洛谷P4925[【LGR-053】洛谷10月月赛I]B.[1007]Scarlet的字符串不可能这么可爱 快速幂


需要考虑的是长度为2或为3的回文串。不考虑限制,第 11 个位置可以填 kk 种,第 22 个位置可以填 k1k-1 种,从第 33 个位置开始可以填 k2k-2 种。
接下来考虑限制。当确定一种填法时,让每个位置的字符字典序增 11,相当于又多一种填法,增 kk 次后复原。当限制一个位置后,相当于答案除以了 kk
综上
ans={ifl=1{ks=01s0ifl=2{k×(k+1)s=0k+1s0ifl3{k×(k1)×(k2)l2s=0(k1)×(k2)l2s0ans=\begin{cases}if\quad l=1\begin{cases}k\quad s=0\\1\quad s\neq0\end{cases}\\if\quad l=2\begin{cases}k\times(k+1)\quad s=0\\k+1\quad s\neq0\end{cases}\\if\quad l\geq3\begin{cases}k\times(k-1)\times(k-2)^{l-2}\quad s=0\\(k-1)\times(k-2)^{l-2}\quad s\neq0\end{cases}\end{cases}
快速幂乘出即可。

#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;
}

总结

考场上没推出来不应该。之前有一道涂颜色的题推法和这个类似。

相关文章:

猜你喜欢
相关资源
相似解决方案