博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Bzoj1026 windy数
阅读量:6292 次
发布时间:2019-06-22

本文共 1327 字,大约阅读时间需要 4 分钟。

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
【数据规模和约定】
20%的数据,满足 1 <= A <= B <= 1000000 。
100%的数据,满足 1 <= A <= B <= 2000000000 。
 
对Windy这个词感到异常亲切
 
数位DP
  先预处理出f[数的位数i][首位是j]=满足条件的windy数的个数。
  读入范围时,先累加位数小于n的位数的答案数,然后特殊处理位数等于n的位数的答案。
1 /*by SilverN*/ 2 #include
3 #include
4 #include
5 #include
6 #include
7 using namespace std; 8 const int mxn=15; 9 int p[mxn];10 int f[mxn][mxn];11 int L,R;12 void init(){13 int i,j;14 p[1]=1;15 for(i=2;i<=10;i++)p[i]=p[i-1]*10;16 for(i=0;i<=9;i++)f[1][i]=1;17 for(i=2;i<=10;i++)18 for(j=0;j<=9;j++)19 for(int k=0;k<=9;k++)20 if(abs(j-k)>=2)f[i][j]+=f[i-1][k];21 return;22 }23 int calc(int n){24 if(!n)return 0;25 int res=0;26 int len=10;while(p[len]>n)len--;27 int i,j;28 for(i=1;i
=2)res+=f[i][j];39 }40 if(abs(tmp-last)<2)break;41 last=tmp;42 n%=p[i];43 }44 return res;45 }46 int main(){47 init();48 scanf("%d%d",&L,&R);49 printf("%d",calc(R)-calc(L-1));50 return 0;51 }

 

转载于:https://www.cnblogs.com/SilverNebula/p/5869074.html

你可能感兴趣的文章
Nginx配置文件详细说明
查看>>
怎么用Navicat Premium图标编辑器创建表
查看>>
Spring配置文件(2)配置方式
查看>>
MariaDB/Mysql 批量插入 批量更新
查看>>
ItelliJ IDEA开发工具使用—创建一个web项目
查看>>
solr-4.10.4部署到tomcat6
查看>>
切片键(Shard Keys)
查看>>
淘宝API-类目
查看>>
virtualbox 笔记
查看>>
Git 常用命令
查看>>
驰骋工作流引擎三种项目集成开发模式
查看>>
SUSE11修改主机名方法
查看>>
jdk6.0 + Tomcat6.0的简单jsp,Servlet,javabean的调试
查看>>
Android:apk签名
查看>>
2(2).选择排序_冒泡(双向循环链表)
查看>>
MySQL 索引 BST树、B树、B+树、B*树
查看>>
微信支付
查看>>
CodeBlocks中的OpenGL
查看>>
短址(short URL)
查看>>
第十三章 RememberMe——《跟我学Shiro》
查看>>