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

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


需要考虑的是长度为2或为3的回文串。不考虑限制,第 1 1 1 个位置可以填 k k k 种,第 2 2 2 个位置可以填 k − 1 k-1 k1 种,从第 3 3 3 个位置开始可以填 k − 2 k-2 k2 种。
接下来考虑限制。当确定一种填法时,让每个位置的字符字典序增 1 1 1,相当于又多一种填法,增 k k k 次后复原。当限制一个位置后,相当于答案除以了 k k k
综上
a n s = { i f l = 1 { k s = 0 1 s ≠ 0 i f l = 2 { k × ( k + 1 ) s = 0 k + 1 s ≠ 0 i f l ≥ 3 { k × ( k − 1 ) × ( k − 2 ) l − 2 s = 0 ( k − 1 ) × ( k − 2 ) l − 2 s ≠ 0 ans=\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} ans=ifl=1{ks=01s̸=0ifl=2{k×(k+1)s=0k+1s̸=0ifl3{k×(k1)×(k2)l2s=0(k1)×(k2)l2s̸=0
快速幂乘出即可。

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

总结

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

你可能感兴趣的:(比赛,洛谷,快速幂)