G - At Most 2 Colors (atcoder.jp)

重点讲解方法三,因为方法三是蒟蒻都能想出来的方法一和方法二都可以借助方法三的思想推出

方法一

这是最简单的设置状态的方法,\(dp[i]\)表示前\(i\)个的方案数,然后分类

  • 若\([i-k+1,i-1]\)有两种颜色

    那么第\(i\)位的取值肯定时这两种颜色中的一个,所以就是要\(\times2\),考虑如何使得\([i-k+1,i-1]\)必须有两个颜色,用总方案减去只有一种颜色的方案,也就是\(dp[i-1]-dp[i-k+1]\)

\(dp[i]+=(dp[i-1]-dp[i-k+1])\times2\)

  • 若\([i-k+1,i-1]\)只有一种颜色

此时第\(i\)位有\(c\)种取值,则\(dp[i]+=dp[i-k+1]\times c\)

所以综上:\(dp[i]=dp[i-1]\times2+(c-2)\times dp[i-k+1]\)

方法二

设\(dp[i][1/2]\)表示\([i-k+2,i]\)中有\(1/2\)种颜色的方案数

分类讨论,然后枚举\(j\)表示\([j+1,i]\)的颜色都相同

\[\begin{aligned}
&dp[i][1]=\sum_{j=1}^{i-k+1}(dp[j][1]\times(c-1)+dp[j][2])\\
&dp[i][2]=\sum_{j=i-k+2}^{i-1}(dp[j][1]\times(c-1)+dp[j][2])
\end{aligned}
\]

方法三

\(dp\)状态同二

\[\begin{aligned}
&dp[i][1]=dp[i-1][1]+dp[i-k+1][1]\times(c-1)+dp[i-k+1][2]\\
&dp[i][2]=dp[i-1][1]\times(c-1)+dp[i-1][2]\times2-dp[i-k+1][1]\times(c-1)
-dp[i-k+1][2]
\end{aligned}
\]
  • 对于\(dp[i][1]\)

    • 当\(i-k+1\)的颜色与\([i-k+2,i]\)的颜色相同时,显然有\(dp[i-1][1]\)

    • 颜色不同时,将考虑的范围向前扩展到\([i-2k+3,i-k+1]\),这时可以保证对于以\([i-k+1,i-1]\)结尾的长度为\(k-1\)的区间都被囊括其中,以下所有方法的合法性都可以用这个来解释

      • 当\([i-2k+3,i-k+1]\)的颜色都相同时,\([i-k+2,i]\)的颜色可以取除了\([i-2k+3,i-k+1]\)以外的任何颜色,这时就是\(dp[i-k+1][1]\times(c-1)\)

      • 当\([i-2k+3,i-k+1]\)颜色不同时,若两种颜色分别为\(a\)和\(b\),且\(i-k+1\)的颜色为\(a\),\([i-k+2,i]\)的为\(b\),这时就是\(dp[i-k+1][2]\)

  • 对于\(dp[i][2]\)

    • 当\([i-k+1,i-1]\)的颜色相同时,显然有\(i\)的颜色取值有除了\([i-k+1,i-1]\)的颜色外的所有颜色,也就是\(dp[i-1][1]\times(c-1)\)

    • 当\([i-k+1,i-1]\)的颜色不同时,\(i\)的取值就有两种,这时有\(dp[i-1][2]\times2\),但这并不合法,因为\(dp[i-1][2]\)中包含了\([i-k+2,i-1]\)的颜色都为\(a\),而\(i-k+1\)的颜色为\(b\)的方案数,所以考虑减去这种不合法的方案

      发现这种不合法的情况就是\(dp[i][1]\)的第二个大类,所以直接使用

综上:

\[\begin{aligned}
&dp[i][1]=dp[i-1][1]+dp[i-k+1][1]\times(c-1)+dp[i-k+1][2]\\
&dp[i][2]=dp[i-1][1]\times(c-1)+dp[i-1][2]\times2-dp[i-k+1][1]\times(c-1)
-dp[i-k+1][2]
\end{aligned}
\]
#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;
}

[abc279 G] At Most 2 Colors的更多相关文章

  1. webpack学习总结

    前言 在还未接触webpack,就有几个疑问: 1. webpack本质上是什么? 2. 跟异步模块加载有关系吗? 3. 可否生成多个文件,一定是一个? 4. 被引用的文件有其他异步加载模块怎么办? ...

  2. 转:Webpack 指南(整理 草稿)

    基础 安装 首先要安装 Node.js, Node.js 自带了软件包管理器 npm.用 npm 全局安装 Webpack: $ npm install webpack -g 通常我们会将 Webpa ...

  3. leetcode bugfree note

    463. Island Perimeterhttps://leetcode.com/problems/island-perimeter/就是逐一遍历所有的cell,用分离的cell总的的边数减去重叠的 ...

  4. 译:Boost Property Maps

    传送门:Boost Graph Library 快速入门 原文:Boost Property Map 图的抽象数学性质与它们被用来解决具体问题之间的主要联系就是被附加在图的顶点和边上的属性(prope ...

  5. wp8 入门到精通 ---转换

             /// <summary>        /// 颜色字符串转Color        /// </summary>        public static ...

  6. kinect学习笔记(四)——各种数据流

    一.kinect开发的一个流程图 1.我们可以知道一个简单的框架就是几部分 (1)选择使用的kinect传感器 KinectSensor.KinectSensors[] (2)打开需要的数据流 _ki ...

  7. bash构造tmux显示tmux ssh状态

    要求: 于tmux内部链接ssh什么时候, 假设有多个ssh主机. 我们要显示相应的主机ip要显示筛查 实现效果 编辑你的bashrc, 由于我习惯在root下操作, 所以/root/.bashrc. ...

  8. Webpack 入门教程

    Webpack 是一个前端资源加载/打包工具.它将根据模块的依赖关系进行静态分析,然后将这些模块按照指定的规则生成对应的静态资源. 本章节基于 Webpack3.0 测试通过. 从图中我们可以看出,W ...

  9. canvas焰火特效

    之前在抖音上看到了一个很漂亮的焰火效果.这会儿有时间就用canvas实现了一下. 演示地址:http://suohb.com/work/firework4.htm 先看效果:(静态图片看不太出效果,请 ...

  10. [LeetCode] Possible Bipartition 可能的二分图

    Given a set of N people (numbered 1, 2, ..., N), we would like to split everyone into two groups of  ...

随机推荐

  1. 百度生成式AI产品文心一言邀你体验AI创作新奇迹:百度CEO李彦宏详细透露三大产业将会带来机遇(文末附文心一言个人用户体验测试邀请码获取方法,亲测有效)

    目录 中国版ChatGPT上线发布 强大中文理解能力 智能文学创作.商业文案创作 图片.视频智能生成 中国生成式AI三大产业机会 新型云计算公司 行业模型精调公司 应用服务提供商 总结 获取文心一言邀 ...

  2. 【随笔】Axios delete传递数组问题

    pre { overflow-y: auto; max-height: 300px } img { max-width: 500px; max-height: 300px } Axios delete ...

  3. 万字长文带你入门docker

    1 Docker dockerfiler 镜像构建 Compose是在单机进行容器编排 Horbor 镜像仓库 Docker swarm 在多机进行容器编排 Docker Compose缺点是不能在分 ...

  4. Spark基础实验七

    今天在做实验七,最开始有许许多多多的错误,最后通过查找.问同学才知道是数据集的格式和存放位置的原因. 就在好不容易解决了上一个错误,下一个错误就立马而来,错误如下: 目前还未找到解决办法,spark实 ...

  5. 垃圾回收之三色标记法(Tri-color Marking)

    关于垃圾回收算法,基本就是那么几种:标记-清除.标记-复制.标记-整理.在此基础上可以增加分代(新生代/老年代),每代采取不同的回收算法,以提高整体的分配和回收效率. 无论使用哪种算法,标记总是必要的 ...

  6. opengl helloworld vscode 通过glfw 绘制三角形

    opengl helloworld vscode 调用glfw 绘制三角形 目录 opengl helloworld vscode 调用glfw 绘制三角形 打开 glfw.org, 我下的64 目录 ...

  7. python之中文符号转英文符号

    maketrans内置方法, 可以将中文符号转换为英文符号.以下代码中,事先定义(中文符号)和其对应的(英文符号),也就是定义中文符号, 也要有对应的英文符号,否则会报错.这个功能其实和替换功能差不多 ...

  8. python之zipfile应用

    zipfile Python 中 zipfile 模块提供了对 zip 压缩文件的一系列操作. 1 f=zipfile.ZipFile("test.zip",mode=" ...

  9. 在NodeJS中安装babel

    安装babel 打开终端,输入命令:npm install --save-dev @babel/core @babel/cli @babel/preset-env @babel/node 安装完毕之后 ...

  10. 听说你想用免费的FOFA?(第二弹)

    听说你想用免费的FOFA?(第二弹) 上回说到 听说你想用免费的FOFA? 第二弹 记得那是一个阳光正好的午后,我刚更新了导出文件类型,到了晚上就发现fofa hack下载不了了,看了一下最新的规则, ...