【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的更多相关文章

  1. CF908G New Year and Original Order 数位DP

    传送门 看到数据范围到\(10^{700}\)毫无疑问数位DP.那么我们最重要的问题是如何有效地维护所有数位排序之后的数的值. 对于某一个数\(x\),设\(f_{x,i} (i \in [1,9]) ...

  2. CF908G New Year and Original Order(DP,数位 DP)

    又一次降智…… (数位 DP 原来可以写这么短,学到了) 问题可以转化为求数位中 $\ge k$ 的有恰好 $j$ 位的数的个数.设为 $c_{j,k}$. 那么答案就是:(考虑把 $k$ 的贡献拆开 ...

  3. hdu-5642 King's Order(数位dp)

    题目链接: King's Order Time Limit: 2000/1000 MS (Java/Others)     Memory Limit: 65536/65536 K (Java/Othe ...

  4. CF908G New Year and Original Order

    题面 题意翻译 给定$n<=10^{700}$,问$1$到$n$中每个数在各数位排序后得到的数的和.答案$mod\;10^9+7$. 题解 考虑设$f[i][j][k][0/1]$表示前$i$位 ...

  5. 【CF908G】New Year and Original Order(动态规划)

    [CF908G]New Year and Original Order(动态规划) 题面 洛谷 CF 题解 设\(f[i][j][k][0/1]\)表示当前填到了第\(i\)位,有\(j\)个大于等于 ...

  6. 【CF908G】New Year and Original Order

    [CF908G]New Year and Original Order 题面 洛谷 题解 设\(f[i][j][k][l]\)表示当前在第\(i\)位有\(j\)位大于等于\(k\),当前有没有卡上界 ...

  7. BestCoder Round #75 King&#39;s Order dp:数位dp

    King's Order Accepts: 381 Submissions: 1361 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 655 ...

  8. CF908G Original Order

    题目大意: 定义\(R(x) = 每个数在各数位排序后得到的数\) 例如:\(R(321597) = 123579\) 给定一个\(n<=10^{700}\),求\(\sum _{i=1}^n ...

  9. HDU 5642 King's Order【数位dp】

    题目链接: http://bestcoder.hdu.edu.cn/contests/contest_showproblem.php?cid=677&pid=1003 题意: 求长度为n的序列 ...

随机推荐

  1. ng-bind-html-unsafe的替代

    angular 1.2以后(或更早?)移除了ng-bind-html-unsafe,那么我要用这个directive来绑定html代码怎么办?随便一测试,它是不支持把html直接传给它的: //htm ...

  2. geoserver 添加图层数据

    1.添加shapefile文件 首先到http://www2.census.gov/geo/tiger/TIGER2011/CONCITY/上下载名称为tl_2011_47_concity的shape ...

  3. opencv3.2将中文输出到图片上

    opencv自带的putText函数无法输出utf8类型的字符,因此无法将中文打印到图片上.用这篇文章的freetype可以实现中文输出,但是需要将字符解码转码比较麻烦,而Pillow的Image函数 ...

  4. Python函数相关

    Python中的函数也是一种对象,而且函数还是一等公民.函数能作为参数,也能作为返回值,这使得Python中的函数变得很灵活.想想前面两篇中介绍的通过内嵌函数实现的装饰器和闭包. 下面就介绍一下Pyt ...

  5. python3.5 中Django框架连接mysql

    ps:mysqldb目前还不支持3.0python唉,最近赶了个新潮,用起了Python3.4跟Django1.6,数据库依然是互联网企业常见的MySql.悲催的是在Python2.7时代连接MySq ...

  6. Apache Kafka 1.0.0正式发布!

    千呼万唤始出来,经过7年的发展与完善,Apache Kafka 1.0.0正式发布!在笔者看来,比起1.0.0引入的新功能,此版本最大的意义在于标识Kafka各种组件功能的稳定性.不过我们还是来看下1 ...

  7. ibatis 引入多个model

    <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE sqlMap PUBLIC "- ...

  8. 微信小程序连续动画

    <view animation="{{animationData}}" style="background:red;height:100rpx;width:100r ...

  9. PHP 函数引用传值

    <?php /* * @1 $arr = array_fill(1,100,'bbb'); echo memory_get_usage()."<br>"; fun ...

  10. Python学习(25):Python执行环境

    转自 http://www.cnblogs.com/BeginMan/p/3191856.html 一.python特定的执行环境 在当前脚本继续进行 创建和管理子进程 执行外部命令或程序 执行需要输 ...