【CF908G】New Year and Original Order 数位DP
【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值。转移比较复杂,我能1A也是不容易啊。
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
typedef long long ll;
const ll P=1000000007;
int n;
int v[705];
ll ans;
ll f0[705][10][705],f1[705][10][705],g0[705][10][705],g1[705][10][705],pw[705];
char str[705];
int main()
{
int i,a,b,j;
scanf("%s",str),n=strlen(str);
for(pw[0]=i=1;i<=n;i++) v[i]=str[n-i]-'0',pw[i]=pw[i-1]*10%P;
for(a=0;a<=9;a++) f0[0][a][0]=g0[0][a][0]=1;
for(i=1;i<=n;i++) for(a=0;a<=9;a++) for(b=0;b<=9;b++)
{
if(b==8)
{
b++,b--;
}
if(a<b) for(j=0;j<i;j++)
{
f1[i][b][j]=(f1[i][b][j]+f1[i-1][b][j])%P;
f0[i][b][j]=(f0[i][b][j]+f0[i-1][b][j])%P;
if(a<v[i])
{
g1[i][b][j]=(g1[i][b][j]+f1[i-1][b][j])%P;
g0[i][b][j]=(g0[i][b][j]+f0[i-1][b][j])%P;
}
else if(a==v[i])
{
g1[i][b][j]=(g1[i][b][j]+g1[i-1][b][j])%P;
g0[i][b][j]=(g0[i][b][j]+g0[i-1][b][j])%P;
}
}
else if(a==b) for(j=0;j<i;j++)
{
f1[i][b][j+1]=(f1[i][b][j+1]+f1[i-1][b][j]+f0[i-1][b][j]*a*pw[j])%P;
f0[i][b][j+1]=(f0[i][b][j+1]+f0[i-1][b][j])%P;
if(a<v[i])
{
g1[i][b][j+1]=(g1[i][b][j+1]+f1[i-1][b][j]+f0[i-1][b][j]*a*pw[j])%P;
g0[i][b][j+1]=(g0[i][b][j+1]+f0[i-1][b][j])%P;
}
else if(a==v[i])
{
g1[i][b][j+1]=(g1[i][b][j+1]+g1[i-1][b][j]+g0[i-1][b][j]*a*pw[j])%P;
g0[i][b][j+1]=(g0[i][b][j+1]+g0[i-1][b][j])%P;
}
}
else for(j=0;j<i;j++)
{
f1[i][b][j+1]=(f1[i][b][j+1]+f1[i-1][b][j]*10)%P;
f0[i][b][j+1]=(f0[i][b][j+1]+f0[i-1][b][j])%P;
if(a<v[i])
{
g1[i][b][j+1]=(g1[i][b][j+1]+f1[i-1][b][j]*10)%P;
g0[i][b][j+1]=(g0[i][b][j+1]+f0[i-1][b][j])%P;
}
else if(a==v[i])
{
g1[i][b][j+1]=(g1[i][b][j+1]+g1[i-1][b][j]*10)%P;
g0[i][b][j+1]=(g0[i][b][j+1]+g0[i-1][b][j])%P;
}
}
}
for(a=0;a<=9;a++) for(i=1;i<=n;i++) ans=(ans+g1[n][a][i])%P;
printf("%lld",ans);
return 0;
}
【CF908G】New Year and Original Order 数位DP的更多相关文章
- 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$ 的贡献拆开 ...
- 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的序列 ...
随机推荐
- 基于PHP采集数据入库程序(一)
前几天有一朋友要我帮做一个采集新闻信息的程序,抽了点时间写了个PHP版本的,随笔记录下. 说到采集,无非就是远程获取信息->提取所需内容->分类存储->读取->展示 也算是简单 ...
- UNIX环境编程学习笔记(24)——信号处理进阶学习之信号集和进程信号屏蔽字
lienhua342014-11-03 1 信号传递过程 信号源为目标进程产生了一个信号,然后由内核来决定是否要将该信号传递给目标进程.从信号产生到传递给目标进程的流程图如图 1 所示, 图 1: 信 ...
- mysql中explain
1.select_type: /* select_type 使用 SIMPLE */explain select * from tb_shop_order where id='201603292570 ...
- nodejs的__dirname与__filename
__filename变量获取当前模块文件的带有完整绝对路径的文件名:[包含文件名本身的绝对路径] __dirname变量获得当前文件所在目录的完整目录名.[不包含文件名本身的绝对路径] 该方法用于获取 ...
- 3. beeGo 自己写Controller 和 请求数据处理
Controller Controller等同于Django里的view,处理逻辑都是在Controller里面完成的,下面就写一个最简单的Controller. 我们在写自己的controller的 ...
- 如何在xml中设置textview不可见
可见(visible)XML文件:android:visibility="visible"Java代码:view.setVisibility(View.VISIBLE);不可见(i ...
- PDF文件转换成Excel表格的操作技巧
我们都知道2007以上版本的Office文档,是可以直接将文档转存为PDF格式文档的.那么反过来,PDF文档可以转换成其他格式的文档吗?这是大家都比较好奇的话题.如果可以以其他格式进行保存,就可以极大 ...
- Linux下php安装Redis安装
1. 下载 redis-2.4.14.tar.gz 2. 解压 tar -zxvf redis-2.4.14.tar.gz 3.cd redis-2.4.14 4. make 注意:出错 1. CC ...
- springboot+jps+druid项目搭建
pom.xml文件 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www ...
- 如何在 CentOS 7 上安装 Docker
Docker 是一个开源工具,它可以让创建和管理 Linux 容器变得简单.容器就像是轻量级的虚拟机,并且可以以毫秒级的速度来启动或停止.Docker 帮助系统管理员和程序员在容器中开发应用程序,并且 ...