传送门

文章目录

  • 题意:
  • 思路:

题意:

定义S(k)S(k)S(k)为将kkk的每一位拿出来从小到大排序后构成的数,比如S(3421)=1234S(3421)=1234S(3421)=1234,求S(k)1≤k≤nS(k)_{1\le k\le n }S(k)1≤k≤n​。
1≤n≤107001\le n\le 10^{700}1≤n≤10700

思路:

nnn很大,考虑数位dpdpdp。
由于直接处理不好弄,所以需要发现一些规律。
考虑一个数排好之后形式大概是这样的:334593345933459,其中数一定是递增的,我们发现它可以拆成如下形式:
111111111111111 111111111111111111111111111111111111111111111111111111111
假设从上到下某一行是第iii行,那么可以发现这一行111的个数就是≥i\ge i≥i的个数,这就启发我们将每个数都分开考虑,设有lenlenlen个数≥x\ge x≥x,那么这个数的贡献就是∑i=0len−110i\sum_{i=0}^{len-1}10^i∑i=0len−1​10i,考虑用dpdpdp求。
设f[i][j][k][flag]f[i][j][k][flag]f[i][j][k][flag]表示前iii位有jjj个大于≥k\ge k≥k个的数,以及是否压上界,转移的话按照数位dpdpdp的思想来转移就好了:f[i][j+(x>=k)][k][flag∣(x<limit)]+=f[i−1][j][k][flag]f[i][j+(x>=k)][k][flag|(x<limit)]+=f[i-1][j][k][flag]f[i][j+(x>=k)][k][flag∣(x<limit)]+=f[i−1][j][k][flag]
可以发现kkk这一维是多余的,我们完全可以枚举他,所以可以去掉这一维。

// Problem: G. New Year and Original Order
// Contest: Codeforces - Good Bye 2017
// URL: https://codeforces.com/problemset/problem/908/G
// Memory Limit: 256 MB
// Time Limit: 2000 ms
//
// Powered by CP Editor (https://cpeditor.org)//#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,avx,avx2,popcnt,tune=native")
//#pragma GCC optimize(2)
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<map>
#include<cmath>
#include<cctype>
#include<vector>
#include<set>
#include<queue>
#include<algorithm>
#include<sstream>
#include<ctime>
#include<cstdlib>
#include<random>
#include<cassert>
#define X first
#define Y second
#define L (u<<1)
#define R (u<<1|1)
#define pb push_back
#define mk make_pair
#define Mid ((tr[u].l+tr[u].r)>>1)
#define Len(u) (tr[u].r-tr[u].l+1)
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define db puts("---")
using namespace std;//void rd_cre() { freopen("d://dp//data.txt","w",stdout); srand(time(NULL)); }
//void rd_ac() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//AC.txt","w",stdout); }
//void rd_wa() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//WA.txt","w",stdout); }typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;const int N=1000010,mod=1e9+7,INF=0x3f3f3f3f;
const double eps=1e-6;int n;
char s[1010];
int f[710][710][11][2];
// i,j,k,flag 前i位有j个大于>=k个的数,以及是否压上界void add(int &x,int y) {x+=y; if(x>=mod) x-=mod;
}int main()
{//  ios::sync_with_stdio(false);
//  cin.tie(0); cin>>(s+1);n=strlen(s+1);for(int i=0;i<=9;i++) f[0][0][i][0]=1;for(int i=1;i<=n;i++) {for(int j=0;j<=i;j++) {for(int k=0;k<=9;k++) {for(int flag=0;flag<=1;flag++) {int limit=flag? 9:s[i]-'0';for(int x=0;x<=limit;x++) {add(f[i][j+(x>=k)][k][flag|(x<limit)],f[i-1][j][k][flag]);}}}}}int ans=0;for(int i=1;i<=9;i++)for(LL j=1,fun=1;j<=n;j++) {add(ans,1ll*fun*(f[n][j][i][0]+f[n][j][i][1])%mod);fun=(1ll*fun*10+1)%mod;}cout<<ans<<endl;return 0;
}
/**/

Good Bye 2017 G. 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. 2017广东工业大学程序设计竞赛决赛:G. 等凹数字(数位DP)

    Problem G: 等凹数字 Description 定义一种数字称为等凹数字,即从高位到地位,每一位的数字先非递增再非递减,不能全部数字一样,且该数是一个回文数,即从左读到右与从右读到左是一样的, ...

  3. CF908G. New Year and Original Order

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

  4. 详解吉首大学第九届“新星杯”G芒砀山的神秘数字 两种dp

    题目链接 题目大意就是给一个长的字符串a和一个短的字符串b,询问a里面有多少个序列是大于b的. 这里我们分两步来处理,就是我们先算出a中的序列长度和b一样的.因为显然答案是由序列长度一样的数量+序列长 ...

  5. 【泛刷题】gym101471 world final 2017 (G~L)

    [前言] 没错这里是下篇. 上篇请移步这里 [题目] gym G.Replicate Replicate Rfplicbte 一个无限的网格图,初始某些格子内有细胞,每个时刻若一个格子周围八个加上它自 ...

  6. Good Bye 2017

    太菜了啊,一不小心就goodbye rating了 A. New Year and Counting Cards time limit per test 1 second memory limit p ...

  7. hihoCoder-1633 ACM-ICPC北京赛区2017 G.Liaoning Ship’s Voyage 线段与三角形规范相交

    题面 题意:给你一个20*20的地图,起点(0,0),终点(n-1,n-1),有障碍的点为'#',每次可以向8个方向走一步,还给了一个三角形,除了障碍以外,到这8个方向上的点的线段如果没有与三角形相交 ...

  8. 2017-2018 ACM-ICPC Southwestern European Regional Programming Contest (SWERC 2017) G: Cordon Bleu

    Cordon Bleu 时间限制: 1 Sec  内存限制: 128 MB 提交: 22  解决: 7 [提交][状态][讨论版][命题人:admin] 题目描述 A Parisian entrepr ...

  9. CF908G New Year and Original Order

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

最新文章

  1. 新手上路之Hibernate:第一个Hibernate例子
  2. 中国科学院大学计算机金智,金智-中国科学院大学-UCAS
  3. 优化Angularjs的$watch方法
  4. 【图像隐写】基于matlab GUI DWT+SVD数字水印 【含Matlab源码 939期】
  5. 树莓派安装拼音输入法(此处为谷歌拼音输入法)
  6. chrome 下载 中断_如何在Google Chrome浏览器中恢复中断的下载
  7. SEO人员必备技术有哪些
  8. TCP: too many of orphaned sockets错误
  9. Flutter获取焦点
  10. 学计算机小升初,小升初微机派位什么意思
  11. 轻型货车悬架系统的设计(设计说明书+CAD图纸+开题报告+任务书+答辩相关材料)
  12. ROS下利用realsense采集RGBD图像合成点云
  13. 你是这样的 CSS,19个唯美的边框
  14. 两数之和(LeetCode)
  15. 物联网设备网关系统架构设计
  16. 解决virus.vbs.wiritebin.a和Virus.Win32.Ramin.x病毒
  17. 【已完结】【悲报】pip search 报错
  18. docx格式转doc格式时公式问题——MathType的使用
  19. 安卓-system.img镜像文件过大问题
  20. Ae 入门系列之七:蒙版与遮罩

热门文章

  1. java socket 路由_JAVA简单的Socket网络编程!CS
  2. .net 集合分成几个等数量集合_巧用数学游戏,帮助幼儿轻松掌握12种数量关系!...
  3. 美女晕倒怎么办?二哈:这不是一滋就醒......
  4. 全球孩子迷恋手机/iPad,其实罪魁祸首是父母!
  5. 女生转行IT与男生有什么不一样?
  6. 60 Minutes专访李开复:泛人工智能可能永远实现不了
  7. 编程语言的“别样”编年史
  8. 百万大奖参赛攻略 | 让程序员走向财富自由
  9. 如何备份服务器日志到其他服务器_KIWI Syslog日志服务器搭建及配置
  10. 学妹问我Java枚举类与注解,我直接用这个搞定她!