[abc279 G] At Most 2 Colors
G - At Most 2 Colors (atcoder.jp)
重点讲解方法三,因为
方法三是蒟蒻都能想出来的方法一和方法二都可以借助方法三的思想推出
方法一
这是最简单的设置状态的方法,
-
若
有两种颜色那么第
位的取值肯定时这两种颜色中的一个,所以就是要 ,考虑如何使得 必须有两个颜色,用总方案减去只有一种颜色的方案,也就是
- 若
只有一种颜色
此时第
所以综上:
方法二
设
分类讨论,然后枚举
方法三
-
对于
-
当
的颜色与 的颜色相同时,显然有 -
颜色不同时,将考虑的范围向前扩展到
,这时可以保证对于以 结尾的长度为 的区间都被囊括其中,以下所有方法的合法性都可以用这个来解释-
当
的颜色都相同时, 的颜色可以取除了 以外的任何颜色,这时就是 -
当
颜色不同时,若两种颜色分别为 和 ,且 的颜色为 , 的为 ,这时就是
-
-
-
对于
-
当
的颜色相同时,显然有 的颜色取值有除了 的颜色外的所有颜色,也就是 -
当
的颜色不同时, 的取值就有两种,这时有 ,但这并不合法,因为 中包含了 的颜色都为 ,而 的颜色为 的方案数,所以考虑减去这种不合法的方案发现这种不合法的情况就是
的第二个大类,所以直接使用
-
综上:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e6+5,MOD=998244353;
int n,k,c;
ll dp[N][2],invf=499122177;
int main(){
scanf("%d%d%d",&n,&k,&c);
dp[1][1]=c%MOD;
for(int i=2;i<=n;++i){
dp[i][1]=((dp[i-1][1]+dp[max(0,i-k+1)][1]*(c-1)%MOD)%MOD+dp[max(0,i-k+1)][2])%MOD;
dp[i][2]=((dp[i-1][1]*(c-1)%MOD+dp[i-1][2]*2%MOD)%MOD-(dp[max(0,i-k+1)][1]*(c-1)%MOD+dp[max(0,i-k+1)][2])%MOD+MOD)%MOD;
}
printf("%lld\n",(dp[n][1]+dp[n][2])%MOD);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统