首页 > 其他分享 >[abc279 G] At Most 2 Colors

[abc279 G] At Most 2 Colors

时间:2023-05-26 18:36:11浏览次数:55  
标签:颜色 方法 times2 times Most Colors aligned abc279 dp

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;
}

标签:颜色,方法,times2,times,Most,Colors,aligned,abc279,dp
From: https://www.cnblogs.com/LuoyuSitfitw/p/17435532.html

相关文章

  • Traceback (most recent call last) File upload.py, line 47, in module with
    博客园图片上传bugPleaseinputfilepath:D:\桌面\工作区\Typora笔记\05-杂\Bug合集\由于找不到MSVCP110.dll,无法继续执行代码。重新安装程序可能会解决此问题.mdTraceback(mostrecentcalllast):File"upload.py",line47,inwithopen(md_path,encoding='utf-8')......
  • CF1759C Thermostat
    原题链接(https://codeforces.com/contest/1759/problem/D)题意简述共t组输入每组输入五个整数l,r,x,a,b(l<=a,b<=r)对于a的操作,可从a变成c,但要保证|c-a|>=x,并且l<=c<=r问从a到b的最少操作步数为多少,若不能到b则输出-1个人分析1,a=b,步数为02,|a-b|>=x,直接a到b,步数为13,当......
  • Codeforces Round #156 (Div. 2) C. Almost Arithmetical Progression dp
    Genalovessequencesofnumbers.Recently,hehasdiscoveredanewtypeofsequenceswhichhecalledanalmostarithmeticalprogression.Asequenceisanalmostarithmeticalprogression,ifitselementscanberepresentedas:a1 = p,wherepissomeintege......
  • [AGC061D] Almost Multiplication Table
    人类智慧。答案显然具有可二分性,考虑如何check。我们使用调整法,不妨设\(x_n<y_m\)(反着做同理),一开始我们令\(x_i=1,y_i=+\infty\)。每次我们期望让\(x\)不断变大,\(y\)不断变小,不断将它们调整到当前的上下界。具体的,每次令\(x_i=\max\{x_i,\max\lceil{a_{i,j}-k\overy......
  • C - Almost Sorted
    https://atcoder.jp/contests/arc132/tasks/arc132_c很难想到的动态规划,优化空间的思路非常巧妙用相对位置来转移f[i][j]表示i之前,放置数字的压缩情况为j,的所有方案数**f[i+1][(j|(1<<k))>>1]+=f[i][j]**k表示i放的数字的相对位置具体转移还是看代码#include<b......
  • DZY Loves Colors
    DZYLovesColors题面翻译有一个\(n\)个元素组成的序列,每个元素有两个属性:颜色\(c_i\)和权值\(w_i\)。\(c_i\)初始为\(i\),\(w_i\)初始为\(0\)。\(m\)次操作,操......
  • CF888D Almost Identity Permutations 题解
    CF链接:AlmostIdentityPermutationsLuogu链接:AlmostIdentityPermutations${\scr\color{Aquamarine}{\text{Solution}}}$前言这好像是一道能用数学秒掉的题目但......
  • ABC279H 题解
    学考时候推的。场上记错模数,以为是\(998244353\)然后想了半天组合数怎么算)简单题。首先序列问题考虑每个位置的生成函数然后乘起来。位置\(k\)的生成函数显然是\[\s......
  • CTF中的神兵利刃-foremost工具之文件分离
    原理Foremost可以依据文件内的文件头和文件尾对一个文件进行分离,或者识别当前的文件是什么文件。比如拓展名被删除、被附加也仍然可以对其分离。使用安装:需要使用这个......
  • Codeforces Round #254 (Div. 1) C - DZY Loves Colors 线段树|lazytag维护区间加
    开一个变量维护同一个区间内颜色是否相同,而且显然要用lazytag了递归到颜色相同的区间时就可以直接打标记然后对于标记,维护的就是常规区间加的部分(最开始没写lazy,wa6,没明......