Scarlet的字符串不可能这么可爱

探讨如何计算特定条件下,长度为L的字符串中不含长度大于1的回文子串的数量,特别关注字符集大小、字符串长度及模数的影响,并提供了解决方案的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

Scarlet妄图构造字符集为kkk,长度为LLL的字符串,满足没有任何一个长度超过111的回文连续子串。

看起来这样的字符串太多了,Scarlet随手加了个限制:她指定了字符串的第sss位为www。

这下Scarlet不会做了,请你来帮她计算究竟有多少满足条件的字符串。按照套路,你只要求出答案对ppp取模后的结果。

输入格式

第一行三个整数k,Lk,Lk,L和ppp,分别表示构造的字符串的的字符集、长度和模数。

第二行两个整数s,ws,ws,w,描述Scarlet给的限制。

注意:s=0s=0s=0表示该数据点中Scarlet十分良心地没有添加限制

输出格式

一行一个整数,表示答案对ppp的取模后的结果。

输入输出样例

输入 #1
3 3 233
1 1
输出 #1
2

【解题思路】

假设字符集大小为444,长度为555,如果没有限制的话,很明显,答案为4∗3∗2∗2∗2=964*3*2*2*2=9643222=96,因为我们要求一个没有回文串的字符串,所以一个位置会对后面两位进行限制,也就是说第一位可以用kkk种,但是第二位就会因为前面一个位置的限制而少掉111种字符的使用,然后从第三位开始一直是k−2k-2k2种了。

至此我们得出结论,当s==0s==0s==0,k>=2k>=2k>=2、l>=2l>=2l>=2时,ans=k∗(k−1)∗(k−2)l−2ans=k*(k-1)*(k-2)^{l-2}ans=k(k1)(k2)l2(当然,000^000还是不行滴)

如果指定字符呢?其实也没有什么大不了的,在前面我们可以发现每一个字符会对后两位进行限制,那么这个指定的字符只是会对前后两位有限制,

比如上方原本的例子,原来是4∗3∗2∗2∗24*3*2*2*243222,我们可以先假设它限制的是111~555中的一位,再进行计算,结果如下

第一位:X∗3∗2∗2∗2X*3*2*2*2X3222

第二位:3∗X∗2∗2∗23*X*2*2*23X222

第三位:3∗2∗X∗2∗23*2*X*2*232X22

而第四第五种事实上是等价于第一第二种的,由此我们得出结论,在有限制条件的情况下,ans=(k−1)∗(k−2)l−2ans=(k-1)*(k-2)^{l-2}ans=(k1)(k2)l2

那么我们只需要判断有没有限制字符,再直接计算即可,值得注意的是,我们这里需要用到快速幂,且一开始就需要对kkk取余,否则就会WAWAWA掉。

注意:由于粘贴的问题每串字符会重复三次,影响阅读体验

【code】

 1 #include<bits/stdc++.h>
 2 #define ll long long
 3 using namespace std;
 4 ll k,l,Mod,s,w,ans=1;
 5 ll poww(ll a,ll b)//快速幂
 6 {
 7     ll sum=1;
 8     a%=Mod;
 9     while(b!=0)
10     {
11         if(b&1!=0) sum=sum*a%Mod;
12         b=b >> 1;
13         a=a*a%Mod;
14     }
15     return sum;
16 }
17 int main()
18 {
19     scanf("%lld %lld %lld %lld %lld",&k,&l,&Mod,&s,&w);
20     k%=Mod;//先膜为敬
21     if(l==1)//特判特殊情况
22     {
23         if(s) printf("1");
24         else printf("%lld",k);
25     }
26     if(s) ans=ans*(k-1)%Mod;
27     else ans=ans*k*(k-1)%Mod;//根据有没有指定字符进行分别计算
28     k-=2;
29     ans=(ans*poww(k,l-2))%Mod;
30     printf("%lld",ans);//输出答案
31     return 0;
32 }

 

转载于:https://www.cnblogs.com/66dzb/p/11259066.html

内容概要:本文档详细介绍了Analog Devices公司生产的AD8436真均方根-直流(RMS-to-DC)转换器的技术细节及其应用场景。AD8436由三个独立模块构成:轨到轨FET输入放大器、高动态范围均方根计算内核和精密轨到轨输出放大器。该器件仅体积小巧、功耗低,而且具有广泛的输入电压范围和快速响应特性。文档涵盖了AD8436的工作原理、配置选项、外部组件选择(如电容)、增益调节、单电源供电、电流互感器配置、接地故障检测、三相电源监测等方面的内容。此外,还特别强调了PCB设计注意事项和误差源分析,旨在帮助工程师更好地理解和应用这款高性能的RMS-DC转换器。 适合人群:从事模拟电路设计的专业工程师和技术人员,尤其是那些需要精确测量交流电信号均方根值的应用开发者。 使用场景及目标:①用于工业自动化、医疗设备、电力监控等领域,实现对交流电压或电流的精准测量;②适用于手持式数字万用表及其他便携式仪器仪表,提供高效的单电源解决方案;③在电流互感器配置中,用于检测微小的电流变化,保障电气安全;④应用于三相电力系统监控,优化建立时间和转换精度。 其他说明:为了确保最佳性能,文档推荐使用高质量的电容器件,并给出了详细的PCB布局指导。同时提醒用户关注电介质吸收和泄漏电流等因素对测量准确性的影响。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值