传送门


看到数据范围到\(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_JUDGEfreopen("in","r",stdin);//freopen("out","w",stdout);#endifinv9 = poww(9 , MOD - 2);cin >> s; L = s.size(); reverse(s.begin() , s.end());init(); dfs(L - 1);cout << ans % MOD;return 0;
}

转载于:https://www.cnblogs.com/Itst/p/10555123.html

CF908G New Year and Original Order 数位DP相关推荐

  1. Good Bye 2017 G. New Year and Original Order 数位dp + 按数贡献

    传送门 文章目录 题意: 思路: 题意: 定义S(k)S(k)S(k)为将kkk的每一位拿出来从小到大排序后构成的数,比如S(3421)=1234S(3421)=1234S(3421)=1234,求S ...

  2. CF908G. New Year and Original Order

    CF908G. New Year and Original Order Solution 对于一个数xxx,它的贡献为排序之后的值,例如:S(50394)=3459=3∗103+4∗102+5∗101 ...

  3. CF908G New Year and Original Order

    http://codeforces.com/problemset/problem/908/G 题解 考虑一个数的答案怎么算. 比如说32214. 我们求出大于等于1的数的个数,为5个,那么加上5*11 ...

  4. Round Numbers POJ - 3252(数位dp+判断前导零)

    题意 求二进制表示中0的个数大于1的数的个数. 题目 The cows, as you know, have no fingers or thumbs and thus are unable to p ...

  5. 洛谷 P3041 视频游戏的连击Video Game Combos(AC自动机+拓扑排序+数位DP)

    洛谷 P3041 视频游戏的连击Video Game Combos 难度一般,不过这个数位DP其实应该叫做记忆化搜索 题意:玩游戏时可以通过按键组合打出combo技能:然后是已知N个combo的按键方 ...

  6. 【bzoj 1833】【codevs 1359】 [ZJOI2010]count 数字计数(数位dp)

    1833: [ZJOI2010]count 数字计数 Time Limit: 3 Sec  Memory Limit: 64 MB Submit: 2774  Solved: 1230 [Submit ...

  7. 不要62 ---数位DP

    题意:求m到n中不含62和4的数的个数. 题目链接 思路:数位dp模板求满足的数字或不满足的数字,刚学,就求不满足的数. #include<stdio.h> #include<str ...

  8. bzoj 3598 [ Scoi 2014 ] 方伯伯的商场之旅 ——数位DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3598 数位DP...东看西看:http://www.cnblogs.com/Artanis/ ...

  9. cojs 简单的数位DP 题解报告

    首先这道题真的是个数位DP 我们考虑所有的限制: 首先第六个限制和第二个限制是重复的,保留第二个限制即可 第五个限制在转移中可以判断,不用放在状态里 对于第一个限制,我们可以增加一维表示余数即可 对于 ...

最新文章

  1. XML中CDATA及其字符实体的使用
  2. Spring boot 使用
  3. android 辅助服务 简书,Android AccessibilityService使用
  4. 华硕h410csm怎么开启_主板BIOS中的launch CSM选项灰色无法更改的解决方法
  5. 修改Apache的默认站点目录的方法,需要的朋友可以参考下
  6. 浙大 PAT a1058
  7. arcgis 4.x graphicslayer点击事件_ArcGis中X、Y值的巧用方法小记
  8. lync登录时一直停留在登录界面
  9. Volley 源码分析
  10. Jenkins中使用scm拉取代码
  11. BlackBerry Internet Service故障:公司内部同事无法互通邮件,对外联络没有问题
  12. Arcgis Engine 切割图斑(ITool)
  13. 手机拍摄证件照可以用什么软件
  14. 一个c语言源文件可以包含两个以上main,二级C语言习题汇总及标准答案.doc
  15. 情感天地——《不能牵手就握手吧》
  16. 将录音转成文字的方法
  17. Sass - 变量($)
  18. 智能家居创意DIY之智能插座(Homekit可用)
  19. [ZT]迅雷的工作原理
  20. JAVA基础6.51——多态的概述(1)

热门文章

  1. POJ_3262 Protecting the Flowers 【贪心】
  2. 关于Tensorflow安装opencv和pygame
  3. Numpy 新手教程(2)
  4. phonegap安卓手机开发入门
  5. 逻辑回归的通俗解释 逻辑回归的定位
  6. nginx 并发过十万
  7. PowerDesigner常用设置
  8. 【swift学习笔记】三.使用xib自定义UITableViewCell
  9. Hadoop不适合哪些场景 哪些场景适合?
  10. 2017视频监控行业应用趋势与市场发展分析