CF908G New Year and Original Order
题面
题意翻译
给定$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]+f[n][j][k][1])\times \underbrace{111\cdots 11}_{j个1} $$
代码
#include<cstdio>
#include<cstring>
#include<cctype>
#include<algorithm>
#define RG register
#define file(x) freopen(#x".in", "r", stdin);freopen(#x".out", "w", stdout);
#define clear(x, y) memset(x, y, sizeof(x))
const int maxn(710), Mod(1e9 + 7);
int n, ans, f[maxn][maxn][10][2], a[maxn];
char s[maxn];
inline int Add(int x, int y) { return (x + y) % Mod; }
inline void Plus(int &x, const int &y) { x = Add(x, y); }
int main()
{
scanf("%s", s + 1); n = strlen(s + 1);
for(RG int i = 1; i <= n; i++) a[i] = s[i] - '0';
for(RG int i = 0; i < 10; i++) f[0][0][i][0] = 1;
for(RG int i = 0; i < n; i++)
for(RG int j = 0; j <= i; j++)
for(int k = 1; k < 10; k++)
for(int l = 0; l <= 1; l++)
for(int p = 0; p <= (l ? 9 : a[i + 1]); p++)
Plus(f[i + 1][j + (p >= k)][k][l | (p < a[i + 1])],
f[i][j][k][l]);
for(int k = 1; k < 10; k++)
{
int num = 1;
for(RG int i = 1; i <= n; i++)
Plus(ans, 1ll * num * (f[n][i][k][0] + f[n][i][k][1]) % Mod),
num = (10ll * num % Mod + 1) % Mod;
}
printf("%d\n", ans);
return 0;
}
CF908G New Year and Original Order的更多相关文章
- CF908G New Year and Original Order 数位DP
传送门 看到数据范围到\(10^{700}\)毫无疑问数位DP.那么我们最重要的问题是如何有效地维护所有数位排序之后的数的值. 对于某一个数\(x\),设\(f_{x,i} (i \in [1,9]) ...
- CF908G New Year and Original Order(DP,数位 DP)
又一次降智…… (数位 DP 原来可以写这么短,学到了) 问题可以转化为求数位中 $\ge k$ 的有恰好 $j$ 位的数的个数.设为 $c_{j,k}$. 那么答案就是:(考虑把 $k$ 的贡献拆开 ...
- 【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 数位DP
[CF908G]New Year and Original Order 题意:令S(i)表示将i中所有数位上的数拿出来,从小到大排序后组成一个新的数的值.如S(50394)=3459.求$\sum\l ...
- 【CF908G】New Year and Original Order
[CF908G]New Year and Original Order 题面 洛谷 题解 设\(f[i][j][k][l]\)表示当前在第\(i\)位有\(j\)位大于等于\(k\),当前有没有卡上界 ...
- Good Bye 2017 G. New Year and Original Order
G. New Year and Original Order time limit per test 2 seconds memory limit per test 256 megabytes inp ...
- CF908G Original Order
题目大意: 定义\(R(x) = 每个数在各数位排序后得到的数\) 例如:\(R(321597) = 123579\) 给定一个\(n<=10^{700}\),求\(\sum _{i=1}^n ...
- 908G New Year and Original Order
传送门 分析 代码 #include<iostream> #include<cstdio> #include<cstring> #include<string ...
- Codeforces908G. New Year and Original Order
给n<=10^700,问1到n中每个数在各数位排序后得到的数的和.答案膜1e9+7. 一看就是数位DP啦..然而并没有什么思路.. 可以尝试统计n(i,j)表示数j在第i位的出现次数,知道了这个 ...
随机推荐
- MySQL的前缀索引及Oracle的类似实现
MySQL有一个很有意思的索引类型,叫做前缀索引,它可以给某个文本字段的前面部分单独做索引,从而降低索引的大小. 其实,Oracle也有类似的实现,对于文本,它可以通过substr的函数索引,实现同样 ...
- Linux 开机启动流程
Linux的开机启动流程 1.开机BIOS自检 --> 检查CPU,硬盘等硬件信息 2.MBR[Major ...
- 申请Let’s Encrypt永久免费SSL证书过程教程及常见问题
配置证书https://easy.zhetao.com/ 虽然目前Let’s Encrypt免费SSL证书默认是90天有效期,但是我们也可以到期自动续约,不影响我们的尝试和使用,为了考虑到文章的真 ...
- C++:sprintf()的用法(转)
转:http://blog.csdn.net/masikkk/article/details/5634886 更多:http://blog.csdn.net/zjuwispersure/article ...
- EBS中比较复杂的trace方法
FND LOG Messages-------------------------a) Using the System Administrator Responsibility, navigate ...
- [2018HN省队集训D8T3] 水果拼盘
[2018HN省队集训D8T3] 水果拼盘 题意 给定 \(n\) 个集合, 每个集合包含 \([1,m]\) 中的一些整数, 在这些集合中随机选取 \(k\) 个集合, 求这 \(k\) 个集合的并 ...
- 新锤子驾到,通通闪开—Service Mesh
微服务方兴未艾如火如荼之际,除 Spring cloud 等经典框架之外,新一代的微服务开发技术正在悄然兴起,那就是Service Mesh(服务网格).2018 年是Service Mesh 元年, ...
- ubuntu安装pycharm并设置快捷方式
一.tar.gz包安装 从官网下载压缩包 tar zxfv pycharm-professional-2017.3.3.tar.gz cd pycharm-2017.3.3 ./bin/pycharm ...
- Day1 MySql安装和基本操作
数据和数据库 1.数据:客观事物的符号表示. 2.存储介质:纸,光盘,磁盘,u盘,云盘… 3.存储的目的:检索(查询) 存储数据量加大,导致检索的难度升高. 4.数据库(DB:database):按照 ...
- active developer path ("/Applications/Xcode.app/Contents/Developer")
-> git xcrun: error: active developer path ("/Applications/Xcode.app/Contents/Developer" ...