CF1989E Distance to Different 题解
好题。题目要求 数组的数量,但 数组难以直接计算,而 数组和 数组的映射关系并不明显。考虑分析 的性质,并映射到其他数组。
我们发现, 数组与 数组中元素的具体数值无关,只与 数组中元素的不等关系有关。因此,我们考虑把 数组映射到一个反映 数组中元素的不等关系的数组。
记 ,特别的,不难发现 。考虑将 数组映射到 数组。题目中要求 个元素至少出现一次,所以至少有 个 等于 。若至少有 个 等于 ,则一定可以构造出一个 数组满足条件,每次不同时换新的元素即可。因此,这个 数组是可行的,对应的 数组也是可行的。
但是, 数组和 数组并不是严格的双射关系。 和 时, 数组均为 。因此,我们需要强制舍去其中一种情况以保证双射。由于至少有 个 等于 ,显然应该舍去 ,这样可以获得更多的 ,否则可能无法满足条件。
最后,我们使用动态规划计算满足条件的 数组数量。设状态 表示第 个位置,前 位为 ,这一位为 ,一共出现 个 的情况,显然有如下转移方程:
初始 ,目标 。
时间复杂度 ,代码中采用了另一种转移方式。
#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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探