首页 > 其他分享 >「2019 集训队互测 Day 3」操作序列计数 题解

「2019 集训队互测 Day 3」操作序列计数 题解

时间:2023-09-19 22:11:59浏览次数:51  
标签:方案 进制 min 题解 sum 2019 复杂度 Day log

简化题意:对于每一个 $L$,求出有多少个长度为 $L+1$ 的非负整数序列 $a$,满足 $\sum_{i=0}^{L} a_i k^i \leq n$,并且 $a_{L}>0$。

我们注意题目要求的和是小于等于一个数,这不太方便。我们可以把它转化成和等于一个数的形式,其实就是和为 $nk$ 的方案数,这就相当于在最后的和后面乘上一个 $k$,再一直加一使得最终的值为 $nk$ 。容易发现这是一一对应的,最后的 $L$ 只需在原来基础上减一即可。于是我们现在只需要求 $\sum_{i=0}^{L} a_i k^i = n$ 的方案数。

在这个基础上,有两种不同的思考方式:

解法1

我们可以考虑把 $n$ 写成 $k$ 进制的形式,因为最后的 $a_i$ 可能 $\geq k$ ,于是就考虑从高位往低位不断退位,计算退位的方案数,需要满足 $L$ 的高位都为 $0$,第 $L$ 位不为 $0$。所以可以先把 $L$ 的高位先退到第 $L$ 位。再从第 $L$ 位开始从高到低依次退位。

我们记录 $f_{i,x}$ 表示第 $i$ 位当前的值为 $x$,往后退位直到第 $0$ 位的方案数。$g_{i,x}$ 表示第 $i+1$ 位相第 $i$ 位退了 $x$ 位 (注意是第 $i$ 位得到了 $x$ ),往后退位直到第 $0$ 位的方案数。

容易写出转移:

  • $f_{i,x}= \sum_{j=0}^x g_{i-1,jk}$
  • $g_{i,x}= f_{i,x+c_i} $ ( $c_i$ 表示 $n$ 写成 $k$ 进制下的第 $i$ 位)

初值 :$f_{0,i}=1$, $g_{0,i}=1$

对于答案,你可以从低到高枚举每一位。当前是第 $i$ 位,$c_i=n \bmod k$ ,那么 $ans_{i-1} = f_{i,n-1}$ ,注意是 $n-1$ 因为第 $i$ 位不能全退了,最后 $n$ 再除以 $k$。这样就只需要 $\log_k^n$ 的扫一遍即可。

考虑如何求 $f$ 和 $g$ ,第二维可能很大,没法直接存,但我们发现 $f_{i,x}$ 和 $g_{i,x}$ 是一个关于 $x$ 的 $i$ 次多项式,运用归纳法可以轻松证明。类似于 $\sum_{i=0}^x i^k$ 是 $k+1$ 次多项式的证明。

于是我们便可以通过拉格朗日插值求出 $f_i$ 和 $g_i$ ,因为 $f$ 和 $g$ 只是 $x$ 的加减,所以只需要记录 $f$ 即可。而这道题需要高精,复杂度瓶颈在高精乘 ,总复杂度为 $O((log_kn)3)$ 再乘上高精乘的复杂度。

另外,本题只需要高精除低精,插值时前缀和后缀都是一个组合数的形式,可以参考 代码

解法2

有一种不需要插值的做法,但复杂度较高。

就是根据 $\sum_{i=0}^{L} a_i k^i = n$,我们再把 $a_i$ 写成 $k$ 进制的形式。设 $n$ 写成 $k$ 进制的最高位为 $m$。

$\sum_{i=0}^L ki\sum_{j=0}m b_{i,j} k^j = n$

$b_{i,j}$ 表示把 $a_i$ 写成 $k$ 进制下的第 $j$ 位。

$\sum_{i=0}^L \sum_{j=0}^m b_{i,j} k^{i+j} = n$

我们先枚举 $i+j$ ,设为 $d$,推出:

$\sum_{d=0}^m k^d \sum_{i=0}^{\min(L,d)} b_{i,d-i}= n$

我们注意 $b_{i,j} < k $ ,记 $f_d$ 为 $\sum_{i=0}^{\min(L,d)} b_{i,d-i}$,那么 $f_d \leq (k-1) \times (\min(L,d)+1)$ 。

于是方案数就是,先枚举所有的序列 $f$ ,再枚举 $d$ ,把 $f_d$ 个球放到 $\min(L,d)+1$ 个盒子,每个盒子小于 $k$ 个的方案数。这可以直接组合数预处理。

那么因为 $f_i$ 的值域很小,就可以直接 DP 了。这就是一个经典的数位 DP 问题,$f_{i,j}$ 表示考虑了 $0 \sim i$ 位,第 $i$ 位的值为 $j$ 的方案数。$j$ 的范围只有 $k \times \log_k^n$ 级别,所以直接转移即可。复杂度 $O((\log_kn)4)$ 再乘上高精乘的复杂度,比第一种做法好写很多。

标签:方案,进制,min,题解,sum,2019,复杂度,Day,log
From: https://www.cnblogs.com/xzc0920/p/17715967.html

相关文章

  • Python-day12
    复习:1、python异常处理机制try:a=int(input('a='))b=int(input('b='))c=a/bprint(c)exceptZeroDivisionError:print('除数不能为0')exceptValueError:print('输入应该为整数')finally:print('计算结束')tr......
  • 【题解】CF1817 合集
    CF1817AAlmostIncreasingSubsequence考虑几乎上升的序列的长度,就是我们的区间长度减去\(a_{i-2}\geqa_{i-1}\geqa_i\)的对数,然后维护即可,当然个人感觉自己的代码有点长,可以考虑看洛谷题解代码code:#include<bits/stdc++.h>usingnamespacestd;constintNN=2e5+......
  • CF840C 题解
    一、题目描述:给你一个长度为$n$的序列$a_1\sima_n$,$0\lea_i\le1\times10^9$。求有多少种$1\simn$的全排列$b$,使得对于$i\in[2,n],a_{b_i}\timesa_{b_{i-1}}$不是完全平方数。本题中完全平方数的定义:若存在某个整数$k$,使得$k^2=x$,则$x$是一个......
  • 日常记录--day6--2023-9月19日--周二
    日程:今天只有上午有课,7点20起床,吃了个早饭去上课,早上有一节数据结构,复习了一下链表,学了栈和队列。中午小睡一个小时,下午起来学习了一会Java,晚上7-8点听了下代码随想路,8-9点继续力扣。学了什么:Java让人头疼,晚上练了道动态规划,有点不太会,复习了数据结构。PS:不想学习,想要成为插线......
  • 9.18CF1817题解
    9.18CF1817题解A.AlmostIncreasingSubsequence题意给定长度为\(n\)一个序列\(a\)以及\(q\)次询问,每次询问给出\(l\)和\(r\),找出序列\(a\)在\([l,r]\)内最长的几乎递增子序列。对于几乎递增的定义:如果一个序列中不存在连续的三个数\(x\),\(y\),\(z\),使得\(x\g......
  • Exchange 2019 服务器实战化操作-- 6. Outlook 邮件彻底删除之后的恢复
    ==回顾:==上篇文章我们介绍了如何配置Exchangeserver2019的电子数据展示和保留,该功能将有助于企业合规部门对于用户邮件的审查和诉讼保留,今天我们要学习的对象同样也是Exchange非常重要而且很实用的一个功能:SingleItemRecovery,也就是说邮件在客户端删除后的恢复,如果已删除项......
  • 题解 AGC058B 【Adjacent Chmax】
    postedon2022-08-1500:08:56|under题解|sourceproblem一个长为\(n\)的排列\(P\),每次可以选择一个\(i\),令\(v=\max(P_i,P_{i+1})\),使\(P_i=P_{i+1}=v\),求若干次操作后有多少种不同的序列。\(1\leqn\leq5000\)。solution显然地,对于一个\(P_i\),它要么被完全覆盖......
  • AT_arc165_d 题解
    AT_arc165_d[ARC165D]SubstringComparison题解Links洛谷AtCoderDescription给定正整数\(n,m\)和\(m\)个形如\((A_{i},B_{i},C_{i},D_{i})\)的限制条件。判断是否存在一个长度为\(n\)的序列\(P\)满足\(\foralli\in[1,m]\),\(P_{A_{i}\dotsB_{i}}\)字典序......
  • AT_arc165_b 题解
    AT_arc165_b[ARC165B]SlidingWindowSort2题解Links洛谷AtCoderDescription给定正整数\(n,k\)和一个长度为\(n\)的整数\(P\),你需要选择一个长度为\(k\)的区间\([l,l+k-1]\),将这个区间从小到大排序。找到操作后最终字典序最大的排列。\(1\leqk\leqn\l......
  • 3步体验在DAYU200开发板上完成OpenHarmony对接华为云IoT
    本文分享自华为云社区《DAYU200+OpenHarmony3.1.1对接华为云IOT【华为云IoT+鸿蒙】》,作者:DS小龙哥。一、前言OpenHarmony3.1.1是一个开源的智能终端操作系统,主要用于智能家居、智能手机、平板电脑、智能穿戴设备等智能终端设备。是一个分布式操作系统,支持多种硬件平台和多种编程......