【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. ClangFormat代码格式化

    下载地址:https://github.com/travisjeffery/ClangFormat-Xcode 配合Xcode自带的格式化操作,就很不错了 选中内容组合操作: 第一步:ClangFor ...

  2. Maven 与 IntelliJ IDEA 的完美结合

    你是否正在学习Maven?是否因为Maven难用而又不得不用而苦恼?是否对Eclipse于Maven的冲突而困惑? 那么我告诉你一个更直接更简单的解决方案: IntelliJ IDEA! 1. 什么是 ...

  3. Oracle12c 在 Ubuntu 12.04 ~ 18.04 的安装注意事项

    必须的注意点: 1:/bin/sh 必须指向 bash or ksh 2:/usr/lib64 可以忽略的事情: 1:gcc 版本无所谓 2:libstdc++5 无需安装 3:libaio 版本无所 ...

  4. ios Develop mark

    App Distribution Guidehttps://developer.apple.com/library/ios/documaentation/IDEs/Conceptual/AppDist ...

  5. phpcms列表页调用 点击量

    很多朋友经常问Phpcms v9的首页.列表页.内容页点击量如何调用.现在就给大家分享phpcms V9如何分别在首页.列表页.内容页调用点击量代码: 1. Phpcms v9首页调用点击量{pc:c ...

  6. 让maven使用国内镜像和archetypeCatalog

    https://blog.csdn.net/zhang_red/article/details/54603530

  7. python垃圾回收,判断内存占用,手动回收内存,二

    以下为例子,判断计算机内存并释放程序内存. # coding=utf8 import time import psutil, gc, commands,os from logger_until imp ...

  8. [Unity官方文档翻译]Primitive and Placeholder Objects Unity原生3D物体教程

    Primitive and Placeholder Objects 原始的基础物体 Unity can work with 3D models of any shape that can be cre ...

  9. springJdbc in 查询,Spring namedParameterJdbcTemplate in查询

    springJdbc in 查询,Spring namedParameterJdbcTemplate in查询, SpringJdbc命名参数in查询,namedParameterJdbcTempla ...

  10. IIS 7安装ModSecurity实现WAF功能

    ModSecurity 是一款开源Web应用防火墙,支持Apache/Nginx/IIS,可作为服务器基础安全设施,还是不错的选择. 系统环境:window 2008 R2+IIS 7 0X01 Mo ...