题解:P4925 [1007] Scarlet的字符串不可能这么可爱
Solution P4925
Idea
先考虑没有限制。
这里我们用一种颜色代表一种字符。
第三个字符应该填什么?显然不能是红或者是蓝。有剩余
接下来第四个肯定不能填蓝或者绿,但是可以填红。
可能会有人问:如果填和前面相同的颜色不会出现更长的回文串吗?
不会。因为我们在上面已经保证了不会存在长度为
计算答案:第一个可以选
如果加上了限制呢?可以这么理解:
假如第
然后往前填。
不难发现,第
两个答案相乘,得答案为
Code
#include<bits/stdc++.h>
#define int long long
using namespace std;
int l,k,s,mod;
long long ans;
long long qpow(long long a,long long b){
long long res=1;
while(b){
if(b&1)res=res*a%mod;
a=a*a%mod;
b>>=1;
}
return res;
}
int m,n;
signed main(){
scanf("%lld%lld%lld%lld",&k,&l,&mod,&s);
k%=mod;
m=((k-1)%mod+mod)%mod;
n=((k-2)%mod+mod)%mod;
if(s)printf("%lld",1ll*m*qpow(n,l-2)%mod);
else printf("%lld",1ll*(k*m%mod)*(qpow(n,l-2)%mod)%mod);
return 0;
}
Tip
- 题目输入是
个数,为什么只输入了 个?
我们发现各个字符之间是等价的,所以是第几种并没有必要知道,
输入
- 为什么
#define int long long
和signed main
?
这道题不用这句话会获得 int
型变量定义成 long long
型,防止爆 int
。
但是这句话也有副作用。int main()
不能定义成 long long main()
。并且有些时候程序会因此 MLE 或 WA 等。所以不到万不得已不要用这个。
- 为什么有
m=((k-1)%mod+mod)%mod;
和n=((k-2)%mod+mod)%mod;
?
C++ 中,负数取模是负数。如果这题
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】