CF908G New Year and Original Order】的更多相关文章

传送门 看到数据范围到\(10^{700}\)毫无疑问数位DP.那么我们最重要的问题是如何有效地维护所有数位排序之后的数的值. 对于某一个数\(x\),设\(f_{x,i} (i \in [1,9])\)表示\(x\)中的所有数位的值\(\geq i\)的数位数量,比如说\(f_{6345982 , 7} = 2 , f_{1982777 , 7} = 5\).那么\(x = \sum\limits_{i=1}^9 \sum\limits_{j=0}^{f_{x,i} - 1} 10^i = \…
题面 题意翻译 给定$n<=10^{700}$,问$1$到$n$中每个数在各数位排序后得到的数的和.答案$mod\;10^9+7$. 题解 考虑设$f[i][j][k][0/1]$表示前$i$位有$j$位的数字大小$\geq k$,是否严格小于$n$的方案数 转移时,枚举第$i+1$位填$p$ $$ f[i+1][j+(p\geq k)][k][l|(p < a_{i+1})]=\sum f[i][j][k][l] $$ 答案就是 $$ \sum_k\sum_j (f[n][j][k][0]+…
又一次降智…… (数位 DP 原来可以写这么短,学到了) 问题可以转化为求数位中 $\ge k$ 的有恰好 $j$ 位的数的个数.设为 $c_{j,k}$. 那么答案就是:(考虑把 $k$ 的贡献拆开,比如 $9$ 的贡献拆成 $1$ 的贡献的 $9$ 倍,然后分配到 $1$ 到 $9$) $$\sum_{1\le j\le n,1\le k\le 9}c_{j,k}\underbrace{111\dots111}_{j}$$ 求 $c_{j,k}$ 可以数位 DP.(此处不是记忆化搜索的形式,…
[CF908G]New Year and Original Order(动态规划) 题面 洛谷 CF 题解 设\(f[i][j][k][0/1]\)表示当前填到了第\(i\)位,有\(j\)个大于等于\(k\)的数,是否卡到上界的方案数. 这个东西算完之后,等价于默认排好序了. 看起来可以枚举每个数字出现在第几位了. 然而实际上不知道这个数字的出现次数,所以不能按照\(10^j*k\)这样子计算贡献. 怎么办呢,假设前面有\(j\)个数大于\(k\)的数,那么就产生\(\sum_{i=0}^{j…
[CF908G]New Year and Original Order 题意:令S(i)表示将i中所有数位上的数拿出来,从小到大排序后组成一个新的数的值.如S(50394)=3459.求$\sum\limits_{i=1}^nS(i)$. $n\le 10^{700}$. 题解:比较难的数位DP.我们考虑分别计算每个数字的贡献.令f0[i][a][b]表示考虑到第i位数,其中数字a的最高为是b的数的数量,再令f1[i][a][b]表示a这个数的贡献.再设g0,g1表示小于等于n的所有数的DP值.…
[CF908G]New Year and Original Order 题面 洛谷 题解 设\(f[i][j][k][l]\)表示当前在第\(i\)位有\(j\)位大于等于\(k\),当前有没有卡上界的方案数 则枚举新加的数\(p\),有 \[ f[i+1][j+(p\geq k)][k][l|(p<a_i)]=\sum f[i][j][k][l] \] 我们最后统计答案的时候枚举\(k\) 有 \[ ans=\underbrace{111...11}_{j个1}*(f[i][j][k][0]+…
G. New Year and Original Order time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output Let S(n) denote the number that represents the digits of n in sorted order. For example, S(1) = 1, S(5) = 5, …
题目大意: 定义\(R(x) = 每个数在各数位排序后得到的数\) 例如:\(R(321597) = 123579\) 给定一个\(n<=10^{700}\),求\(\sum _{i=1}^n R(i)\).答案模上\(10^9+7\). 思路与解法: 难度比较大的一题.显然是要数位\(DP\)的. 最直白的想法就是:求出\(g[i][j]\)表示数字在\(R(x)\)的第\(j\)位出现的次数. 有了这个我们就可以计算答案了. 但是这个玩意不好\(DP\)处理. 考虑数字\(num\)在\(f…
传送门 分析 代码 #include<iostream> #include<cstdio> #include<cstring> #include<string> #include<algorithm> #include<cctype> #include<cmath> #include<cstdlib> #include<ctime> #include<queue> #include<…
给n<=10^700,问1到n中每个数在各数位排序后得到的数的和.答案膜1e9+7. 一看就是数位DP啦..然而并没有什么思路.. 可以尝试统计n(i,j)表示数j在第i位的出现次数,知道了这个数组后就可以算答案了.可以枚举j,做一次DP,f(a,b,0/1)--考虑第a~n个数,有b个j,是否大于给定数字(因为当前大于给定数字不一定dp到前面的数就大于,所以当前大于给定数字的数也是有贡献的),等等光知道有多少j并不能确定第i位是否有j,行不通. 套路--k(i,j)表示第i位出现的>=j的数…