hihoCoder 1033 : 交错和 数位dp
思路:数位dp,dp(i, j, k)表示考虑i位数,每位数可以任意取[0~9],并且这i位数的交错和为j,k=1表示前缀全是0(如000456),k=0表示前缀不为0。注意,前缀是否为0是这道题的一大坑点。在计算交错和的过程中可能会出现负数,这时应该加上一个数让它变成非负整数。f(123) = f(1) - f(23),根据这个来进行状态转移。
AC代码
#include <cstdio>
#include <cmath>
#include <cctype>
#include <bitset>
#include <algorithm>
#include <cstring>
#include <utility>
#include <string>
#include <iostream>
#include <map>
#include <set>
#include <vector>
#include <queue>
#include <stack>
using namespace std;
#pragma comment(linker, "/STACK:1024000000,1024000000")
#define eps 1e-10
#define inf 0x3f3f3f3f
#define PI pair<long long, long long>
typedef long long LL;
const int maxn = 400 + 5;
const int Non = 200, mod = 1e9+7;
LL dp[20][maxn][2], cnt[20][maxn][2];
int b[25];
int k;
PI dfs(int pre, int d, int flag, int u, int pre_zero) {
if(d == 0) {
if(pre == k) return make_pair(0, 1);
else return make_pair(0, 0);
}
int w = (k-pre)/u + Non;
if(!flag && dp[d][w][pre_zero] != -1)
return make_pair(dp[d][w][pre_zero], cnt[d][w][pre_zero]);
int up = flag ? b[d] : 9;
LL x = 0, y = 0;
for(int i = 0; i <= up; ++i) {
PI pi;
if(pre_zero) {
if(i == 0) pi = dfs(0, d-1, flag&(i==up), 1, 1);
else pi = dfs(i, d-1, flag&(i==up), -1, 0);
}
else pi = dfs(pre + u*i, d-1, flag&(i==up), -u, 0);
//用tmp防止溢出
LL tmp = pi.second * i % mod;
tmp *= ((LL)pow(10, d-1))%mod;
x += tmp + pi.first;
x %= mod;
y += pi.second;
y %= mod;
}
if(!flag) {
dp[d][w][pre_zero] = x;
cnt[d][w][pre_zero] = y;
}
return make_pair(x, y);
}
int getBit(LL x) {
int cur = 1;
while(x) {
b[cur++] = (int)(x%10);
x /= 10;
}
return cur-1;
}
LL solve(LL x) {
if(x <= 0) return 0;
int n = getBit(x);
PI ans = dfs(0, n, 1, 1, 1);
return ans.first;
}
int main() {
memset(dp, -1, sizeof(dp));
memset(cnt, 0, sizeof(cnt));
LL l, r;
while(scanf("%lld%lld%d", &l, &r, &k) == 3) {
LL a = solve(r), b = solve(l-1);
printf("%lld\n", (a-b+mod)%mod);
}
return 0;
}
如有不当之处欢迎指出!
hihoCoder 1033 : 交错和 数位dp的更多相关文章
- [hihocoder 1033]交错和 数位dp/记忆化搜索
#1033 : 交错和 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描写叙述 给定一个数 x,设它十进制展从高位到低位上的数位依次是 a0, a1, ..., an - 1 ...
- 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 筑地市场是位于日本东京都中央区筑地的公营批发市场 ...
随机推荐
- python2.7.5 安装pip 良心推荐,超级简单.
1 先安装setuptools 下载地址:https://pypi.python.org/pypi/setuptools#downloads 将下载后的tar文件解压,用CMD模式进入到解压后的文件所 ...
- 准备:新V8即将到来,Node.js的性能正在改变
V8的Turbofan的性能特点将如何对我们优化的方式产生影响 审阅:来自V8团队的Franziska Hinkelmann和Benedikt Meurer. **更新:Node.js 8.3.0已经 ...
- 【Thinkphp 5】auth权限设置以及实现
1.将auth类下载好 放置目录: extend\auth\auth.php 2.将类中的SQL语句执行,可以在数据库中创建3张表 auth_group(用户组表) auth_ru ...
- mysql基本了解
数据库--MySql 数据仓库.就与我们之前学过的纯文本,properties这些技术一样.用来保存数据.并提供对数据进行增删改查的操作.我们以后做项目时,项目中的数据都是保存在数据库中的.//--- ...
- C#基础(六)--枚举的一些常用操作
本章将介绍以下几点: 1.如何把其它类型转换为枚举类型? 2.如何把枚举中的值添加到下拉菜单中? 一.如何把其它类型转换为枚举类型? 我们回顾一下有关字符串与数字之间的转换,如: ...
- jQuery应用操作之---表格
示例: <table> <thread> <tr><th>姓名</th><th>性别</th><th>暂 ...
- 跟我一起读postgresql源码(十六)——Executor(查询执行模块之——control节点(下))
5.ModifyTable节点 先看一个ModifyTable节点的例子: postgres=# explain update test_01 set id = 5 where name = 'xxx ...
- Django中模板的用法简介
1. 模板系统的介绍 Django作为一个Web框架,其模板所需的HTML输出静态部分以及动态内容插入 模板由HTML代码和逻辑控制代码构成 Django框架的模板语言的语法格式: {{var_nam ...
- 我是如何让minio client上传速度提高几十倍的
minio java client 使用okhttp作为底层的http实现,在产品包里面局域网上传文件的速度一直只有400~800KB/s,经过一天排查发现是-Djava.compile=none禁用 ...
- Cookie、session和localStorage、以及sessionStorage之间的区别
一.Cookie.session和localStorage的区别 cookie的内容主要包括:名字.值.过期时间.路径和域.路径与域一起构成cookie的作用范围.若不设置时间,则表示这个cookie ...