「洛谷P4925」Scarlet的字符串不可能这么可爱

image\(link\)

分析:

回文子串 就说明字符串中 有相邻 \(2\) 个字符相等 或间 \(2\) 个隔 \(1\) 个字符的字符相等
那要没有回文子串 就相邻 \(2\) 个字符 或间 \(2\) 个隔 \(1\) 个字符的字符 不相等

设回文子串中 第 \(1\) 位有 \(k\) 种字符 第 \(2\) 位因为要不同 剩 \((k-1)\) 种 第 \(3\) 位因为要与前 \(2\) 位不同 就剩 \((k-2)\) 种 其余位便都是 \((k-2)\)
如果没有限制 则\(ans=k\times(k-1)\times(k-2)^{L-2}\)
如果指定第 \(s\) 位为 \(w\)\(ans\) 的基础上 \(/k\) 就行了 因为每位都少了种选择
最后 \(ans=(k-1)\times(k-2)^{L-2}\)

快速幂一下就好了

CODE:

点击查看代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll;
ll k,l,p,s,w,ans=1;
ll ksm(ll a,ll b)
{
	ll res=1;
	a%=p;
	while(b)
	{
		if(b&1) res=res*a%p;
		b>>=1;
		a=a*a%p;
	}
	return res;
}
int main()
{
	scanf("%lld%lld%lld%lld%lld",&k,&l,&p,&s,&w);
	k%=p;
	if(l==1)
	{
		if(s) printf("1");
		else printf("%lld",k);
	}
	if(s) ans=ans*(k-1)%p;
	else ans=ans*k*(k-1)%p;
	ans=(ans*ksm(k-2,l-2))%p;
	printf("%lld",ans);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值