CF1989E Distance to Different

好题。题目要求 \(b\) 数组的数量,但 \(b\) 数组难以直接计算,而 \(b\) 数组和 \(a\) 数组的映射关系并不明显。考虑分析 \(b\) 的性质,并映射到其他数组。

我们发现,\(b\) 数组与 \(a\) 数组中元素的具体数值无关,只与 \(a\) 数组中元素的不等关系有关。因此,我们考虑把 \(b\) 数组映射到一个反映 \(a\) 数组中元素的不等关系的数组。

记 \(c_i=[a_i\ne a_{i-1}]\),特别的,不难发现 \(c_1=0\)。考虑将 \(b\) 数组映射到 \(c\) 数组。题目中要求 \(k\) 个元素至少出现一次,所以至少有 \(k-1\) 个 \(c_i\) 等于 \(1\)。若至少有 \(k-1\) 个 \(c_i\) 等于 \(1\),则一定可以构造出一个 \(a\) 数组满足条件,每次不同时换新的元素即可。因此,这个 \(c\) 数组是可行的,对应的 \(b\) 数组也是可行的。

但是,\(b\) 数组和 \(c\) 数组并不是严格的双射关系。\(c=[1,0,1]\) 和 \(c=[1,1,1]\) 时,\(b\) 数组均为 \([1,1,1]\)。因此,我们需要强制舍去其中一种情况以保证双射。由于至少有 \(k\) 个 \(c_i\) 等于 \(1\),显然应该舍去 \([1,0,1]\),这样可以获得更多的 \(c_i=1\),否则可能无法满足条件。

最后,我们使用动态规划计算满足条件的 \(c\) 数组数量。设状态 \(f[i][j][k][l]\) 表示第 \(i\) 个位置,前 \(1\) 位为 \(j\),这一位为 \(k\),一共出现 \(l\) 个 \(c_i=1\) 的情况,显然有如下转移方程:

\[f[i][j][0][l]=f[i][j][0][l]+f[i-1][p][j][l]
\]
\[f[i][j][1][l]=f[i][j][1][l]+f[i-1][p][j][l-1](p\ne1\lor j\ne0)
\]

初始 \(f[1][0][0][0]=1\),目标 \(\sum_{i=0}^{1}\sum_{j=0}^{1}f[n][i][j][k-1]\)。

时间复杂度 \(O(nk)\),代码中采用了另一种转移方式。

#include <bits/stdc++.h>
using namespace std;
long long k,n,f[200001][2][2][11],ans=0;
const long long mod=998244353;
int main()
{
scanf("%lld%lld",&n,&k);
f[1][0][0][0]=1;
for(int i=2;i<=n;i++)
for(int j=0;j<=1;j++)
for(int l=0;l<=1;l++)
for(int p=0;p<=k-1;p++)
for(int q=0;q<=1;q++)
{
if(j==1&&l==0&&q==1)continue;
if(p+q>=k)f[i][l][q][k-1]+=f[i-1][j][l][p],f[i][l][q][k-1]%=mod;
else f[i][l][q][p+q]+=f[i-1][j][l][p],f[i][l][q][p+q]%=mod;
}
for(int i=0;i<=1;i++)
for(int j=0;j<=1;j++)
ans+=f[n][i][j][k-1],ans%=mod;
printf("%lld\n",ans);
return 0;
}

CF1989E Distance to Different 题解的更多相关文章

  1. HUST 1404 Hamming Distance(字符串)

    Hamming Distance Description Have you ever heard of the Hamming distance. It is the number of positi ...

  2. POJ 2253 - Frogger - [dijkstra求最短路]

    Time Limit: 1000MS Memory Limit: 65536K Description Freddy Frog is sitting on a stone in the middle ...

  3. D - Frogger

    Freddy Frog is sitting on a stone in the middle of a lake. Suddenly he notices Fiona Frog who is sit ...

  4. 【题解】UVA10140 [Prime Distance]

    [题解]UVA10140 Prime Distance 哈哈哈哈\(miller-rabbin\)水过去了哈哈哈 还能怎么办呢?\(miller-rabbin\)直接搞.枚举即可,还跑得飞快. 当然此 ...

  5. [LightOJ1240]Point Segment Distance 题解

    题意简述 原题LightOJ 1240,Point Segment Distance(3D). 求三维空间里线段AB与C. 题解 我们设一个点在线段AB上移动,然后发现这个点与原来的C点的距离呈一个单 ...

  6. 题解报告:poj 2689 Prime Distance(区间素数筛)

    Description The branch of mathematics called number theory is about properties of numbers. One of th ...

  7. [LeetCode]题解(python):072-Edit Distance

    题目来源: https://leetcode.com/problems/edit-distance/ 题意分析: word1最少通过多少步可以变成word2.word1只能进行一下的操作.a)插入一个 ...

  8. poj2689 Prime Distance题解报告

    题目戳这里 [题目大意] 给定一个区间[L,R],求区间内的质数相邻两个距离最大和最小的. [思路分析] 其实很简单呀,很明显可以看出来是数论题,有关于质数的知识. 要注意一下的就是L和R的数据范围都 ...

  9. PAT甲题题解-1046. Shortest Distance (20)-做了一个假的最短路,水

    一开始以为是最短路,结果是给你一个环,让你求环上两点之间的距离...那还做毛线 然而还是得做毛线 #include <iostream> #include <cstdio> # ...

  10. LeetCode题解之Hamming Distance

    1.题目描述 2.问题分析 使用C++ 标准库中的 bitset 类,将整数转换为二进制形式,然后再将其转换为字符串,最后比较字符串. 3.代码 int hammingDistance(int x, ...

随机推荐

  1. Chrome 135 版本新特性

    Chrome 135 版本新特性 一.Chrome 135 版本浏览器更新 ** 1. 第三方托管账户注册迁移到 OIDC 授权码流程** Chrome 135 将账户注册的登录页面从营销网站迁移到动 ...

  2. 一款 .NET 开源、免费、轻量级且非侵入性的防火墙软件

    前言 在当今数字化时代,系统服务器网络安全已成为我们日常生活和工作中不可忽视的重要议题.随着网络威胁的日益复杂和多样化,选择一款高效.可靠且易于使用的防火墙软件显得尤为重要.今天大姚给大家分享一款 . ...

  3. DelayQueue的take方法底层原理

    一.DelayQueue的take()方法底层原理 DelayQueue 的 take 方法是其核心方法之一,用于从队列中获取并移除延迟时间到期的元素.如果队列为空或没有延迟到期的元素,调用 take ...

  4. java基础之File、流

    一.File类 我们可以使用File类的方法 创建一个文件/文件夹 删除文件/文件夹 获取文件/文件夹 判断文件/文件夹是否存在 对文件夹进行遍历 获取文件的大小 构造方法: 1.public Fil ...

  5. win7激活,2023年亲测可用 ,win7激活密钥,激活码

    还在找激活密钥,激活win7吗,试了无数个都激活不了? 直接用这个工具激活吧,亲测可用,用过的都知道. WIN7Chew-WGA0.9.exe 阿里云盘:https://www.aliyundrive ...

  6. idea 调试的时候变量的值变成了jar包显示

    如图所示,暂时不知道怎么处理. 应该是module的问题.我是上了重建module了,代码不是很多.

  7. 工具 | Hfish

    0x00 简介 HFish是一款社区型免费蜜罐. 下载地址 HFish下载: HFish下载 0x01 功能说明 支持多种蜜罐服务 支持自定义Web蜜罐 支持流量牵引 支持端口扫描感知能力 支持多种告 ...

  8. 鸿蒙NEXT开发实用技巧:通用工具类

    今天分享一个幽蓝君自己在开发中的小技巧,就是封装一个通用工具类,之前大家如果下载过幽蓝君的代码可能也会发现这个东西.比如我们在开发中有一些比较常用的颜色.尺寸或者方法,都可以用一个类封装起来,这样不仅 ...

  9. 字典(Dictionary) update()方法

    描述 python字典(Dictionary) update()函数吧dict2的键/值对更新到dict里 语法 dict.update(dict2) 参数 dict2 -- 添加到指定字典dict里 ...

  10. Tomcat启动信息乱码

    异常描述:大概看到这个鬼样子-- 打开tomcat解压后文件: conf -> logging.properties 右键,选择以记事本或其他方式打开(只要能修改文件内容的软件都OK) 找到 j ...