首页 > 其他分享 >abc253E 相邻元素之差不低于K的序列数

abc253E 相邻元素之差不低于K的序列数

时间:2024-03-18 20:44:06浏览次数:36  
标签:const int sum abc253E 之差 序列 MInt rep dp

给定n,m,k,找一个序列A[n],使用满足1<=A[i]<=m,并且任意相邻两元素的差的绝对值大于等于k,求满足条件的序列个数,求998244353取模。
2<=n<=1000; 1<=m<=5000; 0<=k<=m-1

设dp[i][j]表示前i个数,以j结尾的方案数,在计算dp[i+1][k]时,可以枚举j进行统计,复杂度为O(n^3),可以通过前缀和优化成O(n^2),再用滚动数组,将空间复杂度从O(n^2)优化到O(n)

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define per(i,a,b) for(int i=b;i>=a;i--)

template<int MOD>
struct MInt {
    int x;
    int norm(int u) const {u%=MOD; if(u<0) u+=MOD; return u;}
    MInt(int v=0):x(norm(v)) {}
    int val() const {return x;}
    MInt operator-() const {return MInt(norm(MOD-x));}
    MInt inv() const {assert(x!=0); return power(MOD-2);}
    MInt &operator*=(const MInt &o) {x=norm(x*o.x); return *this;}
    MInt &operator+=(const MInt &o) {x=norm(x+o.x); return *this;}
    MInt &operator-=(const MInt &o) {x=norm(x-o.x); return *this;}
    MInt &operator/=(const MInt &o) {*this *= o.inv(); return *this;}
    friend MInt operator*(const MInt &a, const MInt &b) {MInt ans=a; ans*=b; return ans;}
    friend MInt operator+(const MInt &a, const MInt &b) {MInt ans=a; ans+=b; return ans;}
    friend MInt operator-(const MInt &a, const MInt &b) {MInt ans=a; ans-=b; return ans;}
    friend MInt operator/(const MInt &a, const MInt &b) {MInt ans=a; ans/=b; return ans;}
    friend std::istream &operator>>(std::istream &is, MInt &a) {int u; is>>u; a=MInt(u); return is;}
    friend std::ostream &operator<<(std::ostream &os, const MInt &a) {os<<a.val(); return os;}
    MInt power(int b) const {int r=1, t=x; while(b){if(b&1) r=r*t%MOD; t=t*t%MOD; b/=2;} return MInt(r);}
};
using mint = MInt<998244353>;

const int N = 1005;
const int M = 5005;
int n, m, k;
mint dp[M], pre[M];
mint sum(int l, int r) {
    return l <= r ? pre[r] - pre[l-1] : 0;
}
void solve() {
    cin >> n >> m >> k;
    rep(j,1,m) dp[j] = 1;
    partial_sum(dp+1, dp+1+m, pre+1);
    rep(i,2,n) {
        rep(j,1,m) {
            if (k == 0)
                dp[j] = sum(1,m);
            else
                dp[j] = sum(1,j-k) + sum(j+k,m);
        }
        partial_sum(dp+1, dp+1+m, pre+1);
    }
    cout << pre[m].val() << "\n";
}

signed main() {
    cin.tie(0)->sync_with_stdio(0);
    int t = 1;
    while (t--) solve();
    return 0;
}

标签:const,int,sum,abc253E,之差,序列,MInt,rep,dp
From: https://www.cnblogs.com/chenfy27/p/18081367

相关文章

  • python时间序列缺失值补零
    有个雨滴谱的数据,情况是有雨滴的时候会记录那个时刻的雨滴情况,但是无雨滴的时间没有记录那么我想花一个雨滴时间序列的情况,就需要补全没有雨滴的时间,并且记录为0数据情况如下: python代码:#!usr/bin/envpython#-*-coding:utf-8-*-"""@author:Su@file:timecomplet.p......
  • FastJson反序列化3-1.2.25绕过
    在1.2.25中,主要添加了config.checkAutoType(typeName,null)函数,所以从这里开始查看检查逻辑;为了方便,先看POC;publicvoidbyPass1(){Strings1="{{\"@type\":\"java.lang.Class\",\"val\":\"com.sun.rowset.JdbcRowSetImpl\"},{......
  • FastJson反序列化2-1.2.24漏洞利用
    1、1.2.24漏洞利用-JNDI漏洞利用思路,如果某个类的set()方法中使用了JNDI,那么则可以使用JDNI注入执行任意命令。事实上在JDK8中就存在这样的类:JDBCRowSetImpl;该类实现了JdbcRowSwt接口,继承自BaseRowSet;packagecom.sun.rowset;其中setAutoCommit方法中的else分支调用了conn......
  • FastJson反序列化1-FastJson基础使用及反序列化流程分析
    1、FastJson简介及使用fastjson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将JavaBean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean。1.1序列化JavaBean;假设现在程序中有一个类User,基本信息如下(省略构造方法及getset方法):packageorg.exampl......
  • 时间序列(二)——实践中应用
    时间序列(二)实践中选择模型通过p、d、q决定需要的模型超参数p的确定超参数q的确定一般情况下如何确定p和q实践中选择模型通过p、d、q决定需要的模型ARIMA模型的公式可以表示为:Y......
  • 时间序列预测的零样本学习是未来还是炒作:TimeGPT和TiDE的综合比较
    最近时间序列预测预测领域的最新进展受到了各个领域(包括文本、图像和语音)成功开发基础模型的影响,例如文本(如ChatGPT)、文本到图像(如Midjourney)和文本到语音(如ElevenLabs)。这些模型的广泛采用导致了像TimeGPT[1]这样的模型的出现,这些模型利用了类似于它们在文本、图像和语音方面获......
  • 第五十七天| 647. 回文子串、5.最长回文子串、516.最长回文子序列
    Leetcode 647.回文子串题目链接:647回文子串题干:给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。回文字符串 是正着读和倒过来读一样的字符串。子字符串 是字符串中的由连续字符组成的一个序列。具有不同开始位置或结束位置的子串,即使是由相同的......
  • CorelDraw 24.5.0.733 Crack + 2024序列号免费下载
    CorelDRAW2024最新版简介图形设计软件CorelDRAWGraphicsSuite2024零售版2024年3月完整版(25.0)正式发布!该更新包含了针对CorelDRAWGraphicsSuite2022年3月版(24.0版)的功能增强以及性能与稳定性改进.CorelDRAW2022增强了图像编辑和导出功能,新功能加快了图片编辑速度,......
  • 政安晨:【深度学习处理实践】(八)—— 表示单词组的两种方法:集合和序列
    咱们接着这个系列的上一篇文章继续:政安晨:【深度学习处理实践】(七)——文本数据预处理https://blog.csdn.net/snowdenkeke/article/details/136697057机器学习模型如何表示单个单词,这是一个相对没有争议的问题:它是分类特征(来自预定义集合的值),我们知道如何处理。它应该被编码......
  • 376. 摆动序列c
    intmax(inti,intj){if(i>j)returni;returnj;}intwiggleMaxLength(int*nums,intnumsSize){int**dp=(int**)malloc(sizeof(int*)*numsSize);for(inti=0;i<numsSize;i++)dp[i]=(int*)malloc(sizeof(int)*2);dp[0][0]=1,dp[0][1]=......