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 。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<cmath>
 6 using namespace std;
 7 typedef long long ll;
 8 const ll maxn=107;
 9 ll a,b;
10 ll f[maxn][maxn],po[maxn];
11 void pre(){
12   po[0]=1;
13   for(ll i=1;i<=12;i++) po[i]=po[i-1]*10;
14   for(ll i=0;i<=9;i++) f[1][i]=1;
15   for(ll i=2;i<=11;i++)//f[i][j]表示的是填了i个数,最高位是j的windy数个数 
16     for(ll j=0;j<=9;j++)//这是枚举顺序的问题 
17       for(ll k=0;k<=9;k++) if(abs(j-k)>=2) f[i][j]+=f[i-1][k]; 
18 }//f[i][j]表示一共i位,最低位是j的数一共有多少 
19 ll cou(ll x){
20   ll w=0,ret=0,y,lft;
21   while(po[w]<=x) w++;//w为这个数的位数 
22   for(ll i=1;i<w;i++)
23     for(ll j=1;j<=9;j++)//?
24       ret+=f[i][j];
25   y=x/po[w-1];//取出最高位 
26   for(ll i=1;i<y;i++)//单独判断,避免前导零 
27     ret+=f[w][i];
28   lft=y;x%=po[w-1];
29   for(ll i=w-1;i>=1;i--){
30     y=x/po[i-1];//取出第i位,取时要注意 
31     for(ll j=0;j<y;j++){//?
32       if(abs(lft-j)>=2) ret+=f[i][j];
33     }
34     if(abs(y-lft)<2) break;
35     lft=y;//? 
36     x%=po[i-1];//?
37   }
38   return ret; 
39 }
40 int main(){
41   cin>>a>>b;
42   pre();
43   cout<<cou(b+1)-cou(a)<<endl;
44   return 0;
45 }

 

posted @ 2018-10-05 20:41  lcan  阅读(455)  评论(0编辑  收藏  举报