luoguP2657 [SCOI2009] windy 数

简述题意:

不含前导零且相邻两个数字之差至少为 \(2\) 的正整数被称为 \(windy\) 数。\(windy\) 想知道,在 \(a\) 和 \(b\) 之间,包括 \(a\) 和 \(b\) ,总共有多少个 \(windy\) 数?

数据范围:\(1 \le a \le b \le 2 \times 10^9\)

Solution:

先设一个 \(f[i][j]\) , 表示枚举到第 \(i\) 位,最高位是 \(j\) ,在 \([j000\cdots , j999\cdots]\) 范围内的 \(windy\) 数的数量

初始状态: $f[1][i] = 1 (0 \le i \le 9) $ , 因为表示的是个数,每个f[1][i]又只能代表一个数,所以赋初值为 \(1\)

转移方程:

\[f[i][j] = \sum_{\mid k - j \mid \ge 2}^{} f[i - 1][k]
\]

求 \(ans_{l,r}\) 时的策略:

设 \(len\) 为 \(r\) 的位数,\(s[len]\) 中存 \(r\) 的每一位

1、对于所有长度小于 \(len\) 的 \(f\) , \(ans += \sum_{1 \le j \le 9}^{1 \le i \le len - 1} f[i][j]\)

2、对于长度等于 \(len\) 且最高位小于 \(s_{len}\) 的 \(f\) , \(ans +=\sum_{1 \le j < a_{len}} f[len][j]\)

3、对于剩下的 \(len - 1\) 位,我们继续执行 \(2\) 操作,不过 \(j \in [0, s_i)\) (因为最高位已经不为零了)

/*
Work by: Suzt_ilymics
Knowledge: 数位DP
Time: O(??)
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#define LL long long
using namespace std; LL read(){
LL s = 0, w = 1;
char ch = getchar();
while(ch < '0' || ch > '9') { if(ch == '-') w = -1; ch = getchar(); }
while(ch >= '0' && ch <= '9') s = (s << 1) + (s << 3) + ch - '0', ch = getchar();
return s * w;
} LL l, r, ans = 0;
LL f[22][22], g[22]; LL quick_pow(LL x, LL p){
LL res = 1;
for( ; p; p >>= 1){
if(p & 1) res = res * x;
x = x * x;
}
return res;
} void init(){//初始化
for(int i = 0; i <= 9; ++i) f[1][i] = 1;
for(int i = 2; i <= 19; ++i){
for(int j = 0; j <= 9; ++j){
for(int k = 0; k <= 9; ++k){
if(abs(k - j) >= 2)
f[i][j] = (f[i][j] + f[i - 1][k]);
}
// cout<<f[i][j]<<" ";
}
// cout<<"\n";
}
} LL solve(LL x){//求出ans_1 —— (x - 1)
// cout<<"lkp ak ioi"<<endl;
LL ans = 0, sum = 0;
LL s[20], len = 0;
for( ; x; x = x / 10) s[++len] = x % 10; for(int i = 1; i <= len - 1; ++i) {
for(int j = 1; j <= 9; ++j){
ans += f[i][j];
}
}
for(int i = 1; i < s[len]; ++i){
ans += f[len][i];
}
for(int i = len - 1; i >= 1; --i){
for(int j = 0; j < s[i]; ++j){
if(abs(j - s[i + 1]) >= 2) ans += f[i][j];
}
if(abs(s[i + 1] - s[i]) < 2) break;
}
return ans;
} int main()
{
l = read(), r = read();
init();
printf("%lld", solve(r + 1) - solve(l));
return 0;
}

luoguP2657 [SCOI2009] windy 数的更多相关文章

  1. [luoguP2657] [SCOI2009]windy数(数位DP)

    传送门 f[i][j]表示位数为i,第i位为j的windy数的个数 先预处理出f数组. 求的时候先算没有前导0的答案,再算位数和给定的数相同的答案. #include <cmath> #i ...

  2. LuoguP2657 [SCOI2009]windy数 【数位dp】By cellur925

    题目传送门 题目大意:在A和B之间,包括A和B,总共有多少个不含前导零且相邻两个数字之差至少为2的正整数? 显然是数位dp啦=w=. 显然与上一位有关,我们$dfs$的时候就要记录$pre$.因为这是 ...

  3. BZOJ1026: [SCOI2009]windy数[数位DP]

    1026: [SCOI2009]windy数 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 6346  Solved: 2831[Submit][Sta ...

  4. bzoj 1026 [SCOI2009]windy数 数位dp

    1026: [SCOI2009]windy数 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline ...

  5. 【数位DP】bzoj1026: [SCOI2009]windy数

    1026: [SCOI2009]windy数 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 4163  Solved: 1864[Submit][Sta ...

  6. 【bzoj】1026: [SCOI2009]windy数

    1026: [SCOI2009]windy数 Description windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道,在A和B之间 ...

  7. bzoj 1026 [SCOI2009]windy数(数位DP)

    1026: [SCOI2009]windy数 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 4550  Solved: 2039[Submit][Sta ...

  8. BZOJ 1026: [SCOI2009]windy数( dp )

    dp..dp(x, t) 表示共x位, 第x位为t有多少个windy数. 对答案差分, 我们只需统计1 ~ l-1和1 ~ r的windy数数量. 考虑如何计算[1, n]的答案 : 从最高位到最低位 ...

  9. 1026: [SCOI2009]windy数

    1026: [SCOI2009]windy数 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 8247  Solved: 3708[Submit][Sta ...

随机推荐

  1. Linux课程知识点总结(二)

    Linux课程知识点总结(二) 七.Shell实用功能 7.1 命令行自动补全 在Linux系统中,有太多的命令和文件名称需要记忆,使用命令行补全功能[Tab]可以快速的写出文件名和命令名 7.2 命 ...

  2. 对象、对象监视器、同步队列、执行线程关系(synchronized的实现细节或原理)

    synchronized在使用的时候底层细节你了解吗,相信很多同学对细节很少关注:比如竞争失败了的线程怎么安置,每个对象的监视器,线程执行synchronized时,其实是获取对象的监视器才能进入同步 ...

  3. Yaml spring boot 二维数组写法

    Yaml channel: info: - channel-ip: 192.168.1.40 channel-no: 5182001001 - channel-ip: 192.168.1.10 cha ...

  4. win8.1默认输入法设置

    1.右击左下角,选择控制面板 2.选择更改输入法 3.选择高级设置 4.在替代默认输入法,从下拉列表中选择自己已安装的输入法,比如搜狗拼音输入法,qq拼音输入法等其他输入法

  5. python实现域名注册查询

    author:摘繁华-蓝白社区 联合出品 域名生成与查询 文件说明: [x] .py源文件 [x] .exe可执行文件 [x] .config.json配置文件 ps: .exe和config.jso ...

  6. Prometheus集群介绍-1

    Prometheus监控介绍 公司做教育的,要迁移上云,所以需要我这边从零开始调研加后期维护Prometheus:近期看过二本方面的prometheus书籍,一本是深入浅出一般是实战方向的:官方文档主 ...

  7. 数仓面试高频考点--解决hive小文件过多问题

    本文首发于公众号:五分钟学大数据 小文件产生原因 hive 中的小文件肯定是向 hive 表中导入数据时产生,所以先看下向 hive 中导入数据的几种方式 直接向表中插入数据 insert into ...

  8. MySQL中in('5,6,7')只取第一个id为5对应的数据的思考

    通过阅读本文你可以更好的理解两个知识点: 1.#{}与${}在实际项目中的使用,避免在项目中使用不当造成不可预知的Bug; 2.MySQL中in里面如果是字符串的话,为什么只取第一个对应的数据,eg: ...

  9. 多年经验,教你写出最惊艳的 Markdown 高级用法

    点赞再看,养成习惯,微信搜索[高级前端进阶]关注我. 本文 GitHub https://github.com/yygmind 已收录,有一线大厂面试完整考点和系列文章,欢迎 Star. 最近在学习的 ...

  10. IntelliJ IDEA启动界面的秘密:当编程遇到艺术

    细心的同学会发现Intellij IDEA每次发版本的时候都会有不同的启动界面背景,都很比较抽象的艺术图像. JetBrains的其它产品也有自己独特的设计. 但是这背后是怎么实现的.有什么寓意却很少 ...