题解 P4925 【[1007]Scarlet的字符串不可能这么可爱】
题目其实不难……赛场上手推了一下居然推出来了
首先很明显地,指定字符的位置和值都没有用……
也就是说,
接下来开始推吧……
假设字符集大小为
至此我们得出结论,当
如果指定字符呢?其实也没有什么大不了的,在前面我们可以发现每一个字符会对后两位进行限制,那么这个指定的字符只是会对前后两位有限制,
比如上方原本的例子,原来是
第一位:
第二位:
第三位:
而第四第五种事实上是等价于第一第二种的,由此我们得出结论,在有限制条件的情况下,
那么我们只需要判断有没有限制字符,再直接计算即可,值得注意的是,我们这里需要用到快速幂,且一开始就需要对
(注:证明过程可能不严谨,这里只是给出了我自己在推结论时的思路,仅供参考)
具体实现见代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll k,l,Mod,s,w,ans=1;
ll poww(ll a,ll b)//快速幂
{
ll sum=1;
a%=Mod;
while(b!=0)
{
if(b&1!=0) sum=sum*a%Mod;
b=b >> 1;
a=a*a%Mod;
}
return sum;
}
int main()
{
scanf("%lld %lld %lld %lld %lld",&k,&l,&Mod,&s,&w);
k%=Mod;//先膜为敬
if(l==1)//特判特殊情况
{
if(s) printf("1");
else printf("%lld",k);
}
if(s) ans=ans*(k-1)%Mod;
else ans=ans*k*(k-1)%Mod;//根据有没有指定字符进行分别计算
k-=2;
ans=(ans*poww(k,l-2))%Mod;
printf("%lld",ans);//输出答案
return 0;
}