[abc279 G] At Most 2 Colors
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]\)的颜色都相同
&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\)状态同二
&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]\)的第二个大类,所以直接使用
综上:
&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的更多相关文章
- webpack学习总结
前言 在还未接触webpack,就有几个疑问: 1. webpack本质上是什么? 2. 跟异步模块加载有关系吗? 3. 可否生成多个文件,一定是一个? 4. 被引用的文件有其他异步加载模块怎么办? ...
- 转:Webpack 指南(整理 草稿)
基础 安装 首先要安装 Node.js, Node.js 自带了软件包管理器 npm.用 npm 全局安装 Webpack: $ npm install webpack -g 通常我们会将 Webpa ...
- leetcode bugfree note
463. Island Perimeterhttps://leetcode.com/problems/island-perimeter/就是逐一遍历所有的cell,用分离的cell总的的边数减去重叠的 ...
- 译:Boost Property Maps
传送门:Boost Graph Library 快速入门 原文:Boost Property Map 图的抽象数学性质与它们被用来解决具体问题之间的主要联系就是被附加在图的顶点和边上的属性(prope ...
- wp8 入门到精通 ---转换
/// <summary> /// 颜色字符串转Color /// </summary> public static ...
- kinect学习笔记(四)——各种数据流
一.kinect开发的一个流程图 1.我们可以知道一个简单的框架就是几部分 (1)选择使用的kinect传感器 KinectSensor.KinectSensors[] (2)打开需要的数据流 _ki ...
- bash构造tmux显示tmux ssh状态
要求: 于tmux内部链接ssh什么时候, 假设有多个ssh主机. 我们要显示相应的主机ip要显示筛查 实现效果 编辑你的bashrc, 由于我习惯在root下操作, 所以/root/.bashrc. ...
- Webpack 入门教程
Webpack 是一个前端资源加载/打包工具.它将根据模块的依赖关系进行静态分析,然后将这些模块按照指定的规则生成对应的静态资源. 本章节基于 Webpack3.0 测试通过. 从图中我们可以看出,W ...
- canvas焰火特效
之前在抖音上看到了一个很漂亮的焰火效果.这会儿有时间就用canvas实现了一下. 演示地址:http://suohb.com/work/firework4.htm 先看效果:(静态图片看不太出效果,请 ...
- [LeetCode] Possible Bipartition 可能的二分图
Given a set of N people (numbered 1, 2, ..., N), we would like to split everyone into two groups of ...
随机推荐
- 声网 X Yalla:面对面不如线上见,中东年轻人最偏爱的语聊房是怎样“炼”成的?
"实时互动的本质是服务,而非功能."这是声网一直以来坚信的理念. 功能上线之后,服务才真正开始.实时互动的每一秒,甚至每一毫秒的体验都需要得到稳定.可靠的保证.而广大用户之所以能够 ...
- 第三届材料化学与复合材料国际学术会议(MCCM 2022)
大会官网:http://www.meeting-mccm.org/ 大会时间:2022年12月16-18日 大会地点:中国-珠海 截稿日期:详情见官网(2022年10月14日) 接受/拒稿通知:投稿后 ...
- ML - Regression
Regression Machine Learning 机器学习的意义就在于让机器具备找一个函数(function)的能力 Different types of Functions Regressio ...
- 集合-LinkedList 源码分析(JDK 1.8)
1.概述 LinkedList 是 Java 集合框架中一个重要的实现,其底层采用的双向链表结构.和 ArrayList 一样,LinkedList 也支持空值和重复值.由于 LinkedList 基 ...
- Unity学习笔记01 —— 编辑器
场景Scene 基本操作 按下鼠标滚轮拖动场景,滑动滚轮缩放场景. 鼠标右键旋转场景,点击""后,通过左键移动场景. 点击右键同时按下W/S/A/D/Q/E键可实现场景漫游. 在S ...
- LeeCode 二叉树问题(二)
二叉树的构建 LeeCode 106: 从中序遍历与后续遍历序列构造二叉树 题目描述 给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, posto ...
- Idea快捷键——Extract Method
idea快捷键 ctrl+alt+M 作用:将一段代码提取为一个方法
- windows安装zabbix错误代码
zabbix安装:windows安装zabbix客户端很多坑,设计到很多问题,常见的问题有安装完成防火墙没有关闭,zabbix服务端接收不到客户端的信息.zabbix在cmd中安装的时候报错误代码,安 ...
- class(类)和构造函数(原型对象)
构造函数和class的关系,还有面向对象和原型对象,其实很多人都会很困惑这些概念,这是第二次总结这些概念了,之前一次,没有class类,其实了解了构造函数,class也就很容易理解了 一. 构造函数和 ...
- [C++基础入门] 4、 程序流程结构
文章目录 4 程序流程结构 4.1 选择结构 4.1.1 if语句 4.1.2 三目运算符 4.1.3 switch语句 4.2 循环结构 4.2.1 while循环语句 4.2.2 do...whi ...