CF908G New Year and Original Order 数位DP
看到数据范围到\(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 = \frac{\sum\limits_{i=1}^9 10^{f_{x,i}} - 1}{9}\)。
经过这一个转化,我们需要维护的就是\(f_{x,i}\)。而\(f_{x,i}\)在数位DP的时候很好动态地维护。
具体来说,数位DP时记录当前填入部分的\(f_{x,i}\),预处理\(dp_{i,j}\)表示对于位数恰好等于\(i-1\)(可以有前导\(0\))的所有数\(p\)的\(10^{f_{p,j}}\)之和,然后就可以直接算了。
#include<bits/stdc++.h>
using namespace std;
const int MOD = 1e9 + 7;
string s;
int dp[707][10] , cur[10] , L , ans , inv9;
inline int poww(long long a , int b){
int times = 1;
while(b){
if(b & 1) times = times * a % MOD;
a = a * a % MOD;
b >>= 1;
}
return times;
}
void init(){
for(int i = 1 ; i < 10 ; ++i)
dp[0][i] = (10 - i) * 10 + i;
for(int i = 1 ; i < L ; ++i)
for(int j = 1 ; j < 10 ; ++j)
dp[i][j] = dp[i - 1][j] * ((10ll - j) * 10 + j) % MOD;
}
void calc(int l){
int sum = (MOD - 9ll * poww(10 , l + 1) % MOD) % MOD;
for(int i = 1 ; i < 10 ; ++i)
sum = (sum + 1ll * (l == -1 ? 1 : dp[l][i]) * poww(10 , cur[i])) % MOD;
ans = (ans + 1ll * sum * inv9) % MOD;
}
void dfs(int l){
if(l < 0){
int sum = 0;
for(int i = 1 ; i < 10 ; ++i)
sum = (sum + poww(10 , cur[i]) - 1) % MOD;
ans = (ans + 1ll * sum * inv9) % MOD;
return;
}
for(int i = 0 ; i <= s[l] - '0' ; ++i){
++cur[i];
i != s[l] - '0' ? calc(l - 1) : dfs(l - 1);
}
}
int main(){
#ifndef ONLINE_JUDGE
freopen("in","r",stdin);
//freopen("out","w",stdout);
#endif
inv9 = poww(9 , MOD - 2);
cin >> s; L = s.size(); reverse(s.begin() , s.end());
init(); dfs(L - 1);
cout << ans % MOD;
return 0;
}
CF908G New Year and Original Order 数位DP的更多相关文章
- 【CF908G】New Year and Original Order 数位DP
[CF908G]New Year and Original Order 题意:令S(i)表示将i中所有数位上的数拿出来,从小到大排序后组成一个新的数的值.如S(50394)=3459.求$\sum\l ...
- CF908G New Year and Original Order(DP,数位 DP)
又一次降智…… (数位 DP 原来可以写这么短,学到了) 问题可以转化为求数位中 $\ge k$ 的有恰好 $j$ 位的数的个数.设为 $c_{j,k}$. 那么答案就是:(考虑把 $k$ 的贡献拆开 ...
- hdu-5642 King's Order(数位dp)
题目链接: King's Order Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Othe ...
- CF908G New Year and Original Order
题面 题意翻译 给定$n<=10^{700}$,问$1$到$n$中每个数在各数位排序后得到的数的和.答案$mod\;10^9+7$. 题解 考虑设$f[i][j][k][0/1]$表示前$i$位 ...
- 【CF908G】New Year and Original Order(动态规划)
[CF908G]New Year and Original Order(动态规划) 题面 洛谷 CF 题解 设\(f[i][j][k][0/1]\)表示当前填到了第\(i\)位,有\(j\)个大于等于 ...
- 【CF908G】New Year and Original Order
[CF908G]New Year and Original Order 题面 洛谷 题解 设\(f[i][j][k][l]\)表示当前在第\(i\)位有\(j\)位大于等于\(k\),当前有没有卡上界 ...
- BestCoder Round #75 King's Order dp:数位dp
King's Order Accepts: 381 Submissions: 1361 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 655 ...
- CF908G Original Order
题目大意: 定义\(R(x) = 每个数在各数位排序后得到的数\) 例如:\(R(321597) = 123579\) 给定一个\(n<=10^{700}\),求\(\sum _{i=1}^n ...
- HDU 5642 King's Order【数位dp】
题目链接: http://bestcoder.hdu.edu.cn/contests/contest_showproblem.php?cid=677&pid=1003 题意: 求长度为n的序列 ...
随机推荐
- kubernetes进阶之七:Service
1.概述 Service也是Kubernetes里的最核心的资源对象之一,Kubernetes里的每个Service其实就是我们经常提起的微服务架构中的一个“微服务”,之前我们所说的Pod.RC等资源 ...
- 痞子衡嵌入式:串口调试工具Jays-PyCOM诞生记(4)- 联合调试(vspd, sscom, PyCharm2018.2)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是串口调试工具Jays-PyCOM诞生之联合调试. 软件开发离不开调试,调试手段分两种:一是黑盒调试,即直接从输入/输出角度测试软件功能是 ...
- [Linux] awk基础编程
1.awk每次读一行数据,如果设置了-F选项,是在这一行使用分隔符分,$0是全部 2.awk由模式和动作组成 3.条件判断模式{动作} a.txt aaa bbb aaa ccc ddd cat a. ...
- Kruskal重构树入门
这个知识点好像咕咕咕了好长了..趁还没退役赶紧补一下吧.. 讲的非常简略,十分抱歉.. 前置知识 Kruskal算法 一定的数据结构基础(如主席树) Kruskal重构树 直接bb好像不是很好讲,那就 ...
- 震惊!Vector两行代码求逆序对,六行代码过普通平衡树
Vector两行代码求逆序对 背景:济南集训Day7上午T2,出了一道逆序对的裸题,SB的我没看出是逆序对来,于是现场推了一个很刁钻的求逆序对的方法 首先我们想一下冒泡排序的过程,我们不难发现,对于每 ...
- 无依赖简单易用的Dynamics 365实体记录数计数器并能计算出FetchXml返回的记录数
本人微信公众号:微软动态CRM专家罗勇 ,回复278或者20180812可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!我的网站是 www.luoyong.me . 我们 ...
- SAP 用户参数 ME_USE_GRID
SAP 用户参数 ME_USE_GRID SAP的一些标准报表格式极其不友好,如果不做特殊参数设定,报表使用起来很不方便.我们可以通过设置user parameter的方式,改变一些报表的显示格式,让 ...
- How to Apply Patches to a WLS 8.1 Environment
APPLIES TO: Oracle Weblogic Server - Version 8.1 to 8.1Information in this document applies to any p ...
- asyncio异步IO——Streams详解
前言 本文翻译自python3.7官方文档--asyncio-stream,译者马鸣谦,邮箱 1612557569@qq.com.转载请注明出处. 数据流(Streams) 数据流(Streams)是 ...
- Go-Ethereum 1.7.2 结合 Mist 0.9.2 实现众筹合约的实例
目录 目录 1.什么是ICO? 2.众筹的奖励-代币 3.众筹合约的完善 3.1.设置众筹合约中使用的代币 3.2.众筹合约的基本设置 3.3.让众筹合约接收以太币 3.4.检测众筹合约是否完成 3. ...