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]的答案 : 从最高位到最低位 ...
随机推荐
- NVMe 图解
http://www.ssdfans.com/?p=1143#rd&sukey=3997c0719f151520989740bb972a716fdb2dbab623808d16acd5075b ...
- careercup-链表 2.1
2.1 编写代码,移除未排序链表中的重复节点. 不使用临时缓存: 如果不允许使用临时的缓存(即不能使用额外的存储空间),那需要两个指针, 当第一个指针指向某个元素时,第二个指针把该元素后面与它相同的元 ...
- UNIX环境高级编程---标准I/O库
前言:我想大家学习C语言接触过的第一个函数应该是printf,但是我们真正理解它了吗?最近看Linux以及网络编程这块,我觉得I/O这块很难理解.以前从来没认识到Unix I/O和C标准库I/O函数压 ...
- mysql的limit、order by和group by的用法
程序执行会重复 用mysql很长时间,limit是分页的一个好工具, select * from table_a where num = 4 limit 1,10, select * from tab ...
- C#实现Ruby的负数索引器
public class InvertibleList<T> : List<T> { public new T this[int index] { get { ) return ...
- Linux下Tomcat安装、配置
/etc/profile./etc/profile.d和.bash_profile区别 /etc/profile和/etc/profile.d区别 .bash_profile 是存放用户的全局变量 / ...
- DLL Export 报错
编译报错: error : syntax error at token xxxx 修改非Unicode 系统区域设计即可
- C# DbHelperSQLite,SQLite数据库帮助类 (转载)
主要功能如下数据访问抽象基础类 主要是访问SQLite数据库主要实现如下功能 .数据访问基础类(基于SQLite),主要是用来访问SQLite数据库的. .得到最大值:是否存在:是否存在(基于SQLi ...
- 使用本地光盘安装Microsoft .NET Framework 3.5 for Win8/WinServer2012
如何使用本地源安装Microsoft .NET Framework 3.5 作为SQL Server 2012的 必要组件,校验组件过程有个小BUG,即使没有安装也通过,但会卡在安装环节(enabli ...
- 如何在cmd中运行数据库
在开始菜单中输入cmd 在控制板输入:net start MSSQLserver 启动数据库 在控制板输入:net stop MSSQLserver 关闭数据库 在控制板输入:net pur ...