【HIHOCODER 1033 】 交错和(数位DP)
描述

输入
输入数据仅一行包含三个整数,l, r, k(0 ≤ l ≤ r ≤ 1018, |k| ≤ 100)。
输出
输出一行一个整数表示结果,考虑到答案可能很大,输出结果模 109 + 7。
提示
对于样例 ,满足条件的数有 110 和 121,所以结果是 231 = 110 + 121。
更多样例
Input
4344 3214567 3
Output
611668829
Input
404491953 1587197241 1
Output
323937411
Input
60296763086567224 193422344885593844 10
Output
608746132
Input
100 121 -1
Output
120
样例输入
100 121 0
样例输出
231
题解
设\(dp[i][j][k]\)为处理到第i位,当前数的位数为j,交错和为k。
import java.io.*;
import java.util.*;
public class Main {
static class pair {
long x, y;
pair(long tx, long ty) {
super();
x = tx;
y = ty;
}
pair() {
x =y = 0;
}
}
static final int mod = 1000000007;
static pair dp[][][] = new pair[25][25][405];
static long l, r, ten[] = new long[20];
static int bit[] = new int[20], k;
static pair dfs(int pos, int s, boolean zero, boolean flag, int sum) {
if (pos < 0)
return new pair(sum == k ? 1 : 0, 0);
if (!zero && !flag &&dp[pos][s][sum+200].x != -1)
return dp[pos][s][sum+200];
int end = (flag ? bit[pos] : 9);
pair ans= new pair(),tmp=new pair();
for (int i = 0; i <= end; i++) {
if (zero) {
if (i == 0)
tmp = dfs(pos - 1, 0, true, flag && (i == end), 0);
else
tmp = dfs(pos - 1, 1, false, flag && (i == end), i);
} else {
tmp = dfs(pos - 1, s + 1, false, flag && (i == end), sum + ((s & 1) == 1 ? -i : i));
}
ans.x = (ans.x + tmp.x) % mod;
ans.y = (ans.y + tmp.y + tmp.x * i * ten[pos] % mod) % mod;
}
if (!flag && !zero)
dp[pos][s][sum+200] = ans;
return ans;
}
static long solve(long n) {
if (n <= 0)
return 0;
int len = 0;
while (n > 0) {
bit[len++] = (int)(n % 10);
n /= 10;
}
return dfs(len - 1, 0, true, true, 0).y;
}
public static void main(String[] args) {
ten[0] = 1;
for (int i = 1; i <= 18; i++)
ten[i] = ten[i - 1] * 10 % mod;
Scanner sc = new Scanner(new InputStreamReader(System.in));
while (sc.hasNext()) {
for (int i = 0; i < 25; i++)
for (int j = 0; j < 25; j++)
for (int h = 0; h < 405; h++)
dp[i][j][h] = new pair(-1, 0);
long l = sc.nextLong(), r = sc.nextLong();
k = sc.nextInt();
System.out.println((solve(r)-solve(l-1)+mod)%mod);
}
sc.close();
}
}
【HIHOCODER 1033 】 交错和(数位DP)的更多相关文章
- [hihocoder 1033]交错和 数位dp/记忆化搜索
#1033 : 交错和 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描写叙述 给定一个数 x,设它十进制展从高位到低位上的数位依次是 a0, a1, ..., an - 1 ...
- hihoCoder 1033 : 交错和 数位dp
思路:数位dp,dp(i, j, k)表示考虑i位数,每位数可以任意取[0~9],并且这i位数的交错和为j,k=1表示前缀全是0(如000456),k=0表示前缀不为0.注意,前缀是否为0是这道题的一 ...
- HihoCoder 1033交错和(数位DP第三题)
(写挂了,有空再补) 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个数 x,设它十进制展从高位到低位上的数位依次是 a0, a1, ..., an - 1,定义 ...
- hihoCoder1033 交错和 数位DP
题目:交错和 链接:http://hihocoder.com/problemset/problem/1033# 题意:对于一个十进制整数x,令a0.a1.a2.....an是x从高位到低位的数位,定义 ...
- hihoCoder 1033: 交错和
(1)题目描述: 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个数 x,设它十进制展从高位到低位上的数位依次是 a0, a1, ..., an - 1,定义交错 ...
- hihoCoder #1033 : 交错和 (数位Dp)
题目大意: 给定一个数 x,设它十进制展从高位到低位上的数位依次是 a0, a1, ..., an - 1,定义交错和函数: f(x) = a0 - a1 + a2 - ... + ( - 1)n - ...
- 【hihoCoder】1033: 交错和
初探数位dp 介绍了数位类统计的基础知识.以下列出其中的基础点: 基本问题 统计在区间[l, r]中满足条件的数的个数 思路 1. [l, r] 将问题转换为 在[0, r]中满足条件的个数 - 在[ ...
- hihocoder #1301 : 筑地市场 数位dp+二分
题目链接: http://hihocoder.com/problemset/problem/1301?sid=804672 题解: 二分答案,每次判断用数位dp做. #include<iostr ...
- hihoCoder #1770 : 单调数(数位dp)
题面 我们定义一个数是单调数,当且仅当构成这个数每一个数位都是单调不降或不增的. 例如 \(123\) 和 \(321\) 和 \(221\) 和 \(111\) 是单调的,而 \(312\) 不是单 ...
- hihocoder #1301 : 筑地市场 二分+数位dp
#1301 : 筑地市场 题目连接: http://hihocoder.com/problemset/problem/1301 Description 筑地市场是位于日本东京都中央区筑地的公营批发市场 ...
随机推荐
- JSP | 基础 | 加载类失败:com.mysql.jdbc.Driver
两个原因: 1. 连接数据库需要的jar包没有导入Tomcat的lib库中 解决方案: 打开Tomcat的安装目录下的lib文件夹,把jar包拖进lib库后,重启tomcat服务器 2. mysql ...
- django接受表单
from django.shortcuts import render from django.shortcuts import HttpResponse import os # Create you ...
- HDU - 6066 RXD's date
Bryce1010模板 http://acm.hdu.edu.cn/showproblem.php?pid=6066 #include <iostream> using namespace ...
- Helga Hufflepuff's Cup CodeForces - 855C
Helga Hufflepuff's Cup CodeForces - 855C 题意:给一棵n个节点的树,要给每一个节点一个附加值,附加值可以为1-m中的一个整数.要求只能有最多x个节点有附加值k. ...
- 搜狐前端css常用命名
- uva 6910 - Cutting Tree 并查集的删边操作,逆序
https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...
- oracle PL、SQL(概念)
一.PL/SQL简介. Oracle PL/SQL语言(Procedural Language/SQL)是结合了结构化查询和Oracle自身过程控制为一体的强大语言,PL/SQL不但支持更多的数据类型 ...
- css实现行内文字垂直居中
之前本人一直使用浮动.相对定位.绝对定位和display:table等css的方法进行定位.网上得知flex可实现弹性布局,符合未来发展趋势,随尝试. 1:让盒子行内文字垂直居中,解决思路是讲文字的行 ...
- iOS开发XML解析
xml解析主要可以使用CData,libxml2以及NSXMLParser,以下对各个方法给出了相应的例子: 1.CDataXML: 1.1.创建FKBook类 #import <Foundat ...
- Delphi7中使用Indy9的IdSmtp发送email时subject过长会出现乱码的解决办法
procedure TIdMessageClient.SendHeader(AMsg: TIdMessage); var LHeaders: TIdHeaderList; begin LHeaders ...