BZOJ 1026 windy数
Description
windy定义了一种windy数。不含前导零且相邻两个数字之差至少为2的正整数被称为windy数。 windy想知道,在A和B之间,包括A和B,总共有多少个windy数?
Input
包含两个整数,A B。
Output
一个整数。
Sample Input
1 10
【输入样例二】
25 50
Sample Output
9
【输出样例二】
20
HINT
【数据规模和约定】
100%的数据,满足 1 <= A <= B <= 2000000000 。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<cstdlib>
using namespace std; #define maxn 15
int A,B,sum,f[maxn][][];
int num[maxn]; inline int len(int lim)
{
int ret = ,pos = ,t = lim;
while (lim) { ++ret; lim/=; }
memset(num,,sizeof(num));
while (t) { ++pos; num[ret - pos + ] = t%; t /= ; }
return ret;
} inline int dp(int lim)
{
if (lim == ) return ;
int ret = ,n = len(lim),i,j,k;
memset(f,,sizeof(f));
for (i = ;i < num[];++i) f[][i][] = ;
f[][num[]][] = ;
for (i = ;i < n;++i)
for (j = ;j < ;++j)
{
if (f[i][j][])
for (k = ;k < ;++k)
{
if (abs(k-j) < ) continue;
f[i+][k][] += f[i][j][];
}
if (!f[i][j][]) continue;
for (k = ;k <= num[i+];++k)
{
if (abs(k-j) < ) continue;
if (k == num[i+])
f[i+][k][] += f[i][j][];
else f[i+][k][] += f[i][j][];
}
}
for (i = ;i < ;++i) for (j = ;j < ;++j) ret += f[n][i][j];
memset(f,,sizeof(f));
for (i = ;i < ;++i) f[][i][] = ;
for (i = ;i < n-;++i)
for (j = ;j < ;++j)
{
if (!f[i][j][]) continue;
for (k = ;k < ;++k)
{
if (abs(j - k) < ) continue;
f[i+][k][] += f[i][j][];
}
}
for (i = ;i < n;++i) for (j = ;j < ;++j) ret += f[i][j][];
return ret;
} int main()
{
freopen("1026.in","r",stdin);
freopen("1026.out","w",stdout);
scanf("%d %d",&A,&B);
sum = dp(B);
sum -= dp(A-);
printf("%d",sum);
fclose(stdin); fclose(stdout);
return ;
}
BZOJ 1026 windy数的更多相关文章
- [bzoj 1026]windy数(数位DP)
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1026 分析: 简单的数位DP啦 f[i][j]表示数字有i位,最高位的数值为j的windy数总 ...
- BZOJ 1026 windy数【数位DP】
1026: [SCOI2009]windy数 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 10142 Solved: 4712[Submit][St ...
- BZOJ 1026 windy数 (数位DP)
题意 区间[A,B]上,总共有多少个不含前导零且相邻两个数字之差至少为2的正整数? 思路 状态设计非常简单,只需要pos.limit和一个前驱数pre就可以了,每次枚举当前位时判断是否与上一位相差2即 ...
- BZOJ 1016 Windy 数 | 数位DP
题目: http://www.lydsy.com/JudgeOnline/problem.php?id=1026 题解: f[i][j][1/0]表示枚举到第i位,这位开头是j,当前的数大于(1)或小 ...
- bzoj 1026 [SCOI2009]windy数 数位dp
1026: [SCOI2009]windy数 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline ...
- 【bzoj】1026: [SCOI2009]windy数
1026: [SCOI2009]windy数 Description windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道,在A和B之间 ...
- bzoj 1026 [SCOI2009]windy数(数位DP)
1026: [SCOI2009]windy数 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 4550 Solved: 2039[Submit][Sta ...
- [BZOJ 1026] [SCOI 2009] Windy数 【数位DP】
题目链接:BZOJ - 1026 题目分析 这道题是一道数位DP的基础题,对于完全不会数位DP的我来说也是难题.. 对于询问 [a,b] 的区间的答案,我们对询问进行差分,求 [0,b] - [0,a ...
- BZOJ 1026: [SCOI2009]windy数( dp )
dp..dp(x, t) 表示共x位, 第x位为t有多少个windy数. 对答案差分, 我们只需统计1 ~ l-1和1 ~ r的windy数数量. 考虑如何计算[1, n]的答案 : 从最高位到最低位 ...
随机推荐
- PHPExcel的读取excel的操作
首先导入类库: require_once 'PHPExcel.php'; require_once 'PHPExcel\IOFactory.php'; require_once 'PHPExcel\R ...
- Oracle笔记-表的管理
3.1创建和管理表在Oracle表中使用的emp,dept,sal都是系统内建好的表,那么在SQL语法中同样支持了表的创建语句,要想创建表,则应先了解下Oracle中最常用的几种数据类型3.1.1常用 ...
- linux find grep使用
在当前目录下所有文件中查找内容包含 string 的文件: find ./ -name "*" -exec grep "string" {} \; 注意:在最后 ...
- Memcache简介
简介 Memcache是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像.视频.文件以及数据库检索的结果等.简单的说就是将数据调 ...
- linux下查找文件
1,find 经常在linux下工作,总要查找一些文件,于是就搜索的学习了一下 find 指定目录 指定条件 指定动作 举例:find . -name "my*" 查找 当前目录下 ...
- H TML5 之 (4) 小项目一 时钟
这里做一个HTML5 入门的练手,一个小时钟项目,可以再上面拓展很多,程序员培养的就是思想 <!DOCTYPE HTML> <html> <head> <ti ...
- rac中 kull session会话脚本
方法:ALTER SYSTEM KILL SESSION '80, 6, @2'; --<= 80 sid,6 serial#,@2 inst_id kill session 脚本如下:sel ...
- 计算从A地出发到各个地方的路径及距离
数据库环境:SQL SERVER 2005 如题,现有bus表数据如下,dstart是起点,dend是终点,distance是两地的距离.
- 使用java的Calendar对象获得当前日期的上几个度开始、结束时间
思路: 先获得当前季度的开始和结束日期,在当前日期的基础上往前推3个月即上个季度的开始和结束日期 /** * @param flag true:开始日期:false:结束日期 * @return */ ...
- ios专题 - 单例模式的实现
[原创]http://www.cnblogs.com/luoguoqiang1985 单例模式是什么? 一个类只有一个实例. ----------------------- 这样做有什么好处? 在我的 ...