题目背景
windy 定义了一种 windy 数。
题目描述
不含前导零且相邻两个数字之差至少为 2 的正整数被称为 windy 数。windy 想知道,在 a 和 b 之间,包括 a 和 b ,总共有多少个 windy 数?
输入格式
输入只有一行两个整数,分别表示 a 和 b。
输出格式
输出一行一个整数表示答案。
题解
首先,注意到2e9数据范围其实并不大,于是我们可以考虑通过打表把一个个长度为2e6的数据区间分割出来,并赋值为当家区间与之前所有区间的windy数的数量的前缀和,之后我们就可以根据a和b所处的区间来决定是直接遍历还是先求出a和b之间的区间内的windy数的数量再遍历,主要运用了分块打表的思想。
#include <iostream>
using namespace std;
#define ll long long
bool check(ll x){//检查x是否为windy数
ll w=-10;
while(x){
if(abs(x%10-w)<2)return false;
w=x%10;
x/=10;
}
return true;
}
ll wel[1005]={0,338305, 615022, 891526, 1168243, 1459689, 1459689, 1597903, 1874407, 2151124, 2442570, 2597885,
2597885, 2874389, 3151106, 3442552, 3733998, 3733998, 3872250, 4148967, 4440413, 4731859, 4870362,
4870362, 5147079, 5438525, 5729971, 6006688, 6006688, 6145191, 6436637, 6728083, 7004800, 7143052,
7143052, 7434498, 7725944, 8002661, 8279165, 8279165, 8434480, 8725926, 9002643, 9279147, 9417361,
9417361, 9708807, 9985524, 10262028, 10538745, 10538745, 10538745, 10538745, 10538745, 10538745, 10538745,
10538745, 10538745, 10538745, 10538745, 10538745, 10538745, 10538745, 10538745, 10538745, 10538745, 10830191,
10830191, 10968443, 11245160, 11536606, 11828052, 11966555, 11966555, 12243272, 12534718, 12826164, 13102881,
13102881, 13241384, 13532830, 13824276, 14100993, 14239245, 14239245, 14530691, 14822137, 15098854, 15375358,
15375358, 15530673, 15822119, 16098836, 16375340, 16513554, 16513554, 16805000, 17081717, 17358221, 17634938,
17634938, 17634938, 17911655, 18188159, 18464876, 18756322, 18756322, 18756322, 18756322, 18756322, 18756322,
18756322, 18756322, 18756322, 18756322, 18756322, 18756322, 18756322, 18756322, 18756322, 18756322, 19047768,
19186271, 19186271, 19462988, 19754434, 20045880, 20322597, 20322597, 20461100, 20752546, 21043992, 21320709,
21458961, 21458961, 21750407, 22041853, 22318570, 22595074, 22595074, 22750389, 23041835, 23318552, 23595056,
23733270, 23733270, 24024716, 24301433, 24577937, 24854654, 24854654, 24854654, 25131371, 25407875, 25684592,
25976038, 25976038, 26114252, 26390756, 26667473, 26958919, 26958919, 26958919, 26958919, 26958919, 26958919,
26958919, 26958919, 26958919, 26958919, 26958919, 26958919, 26958919, 26958919, 26958919, 26958919, 27250365,
27527082, 27527082, 27665585, 27957031, 28248477, 28525194, 28663446, 28663446, 28954892, 29246338, 29523055,
29799559, 29799559, 29954874, 30246320, 30523037, 30799541, 30937755, 30937755, 31229201, 31505918, 31782422,
32059139, 32059139, 32059139, 32335856, 32612360, 32889077, 33180523, 33180523, 33318737, 33595241, 33871958,
34163404, 34318719, 34318719, 34595223, 34871940, 35163386, 35163386, 35163386, 35163386, 35163386, 35163386,
35163386, 35163386, 35163386, 35163386, 35163386, 35163386, 35163386, 35163386, 35163386, 35163386, 35454832,
35731549, 35869801, 35869801, 36161247, 36452693, 36729410, 37005914, 37005914, 37161229, 37452675, 37729392,
38005896, 38144110, 38144110, 38435556, 38712273, 38988777, 39265494, 39265494, 39265494, 39542211, 39818715,
40095432, 40386878, 40386878, 40525092, 40801596, 41078313, 41369759, 41525074, 41525074, 41801578, 42078295,
42369741, 42661187, 42661187, 42799439, 43076156, 43367602, 43367602, 43367602, 43367602, 43367602, 43367602,
43367602, 43367602, 43367602, 43367602, 43367602, 43367602, 43367602, 43367602, 43367602, 43367602, 43659048,
43935765, 44212269, 44212269, 44367584, 44659030, 44935747, 45212251, 45350465, 45350465, 45641911, 45918628,
46195132, 46471849, 46471849, 46471849, 46748566, 47025070, 47301787, 47593233, 47593233, 47731447, 48007951,
48284668, 48576114, 48731429, 48731429, 49007933, 49284650, 49576096, 49867542, 49867542, 50005794, 50282511,
50573957, 50865403, 51003906, 51003906, 51280623, 51572069, 51572069, 51572069, 51572069, 51572069, 51572069,
51572069, 51572069, 51572069, 51572069, 51572069, 51572069, 51572069, 51572069, 51572069, 51572069, 51863515,
52140232, 52416736, 52554950, 52554950, 52846396, 53123113, 53399617, 53676334, 53676334, 53676334, 53953051,
54229555, 54506272, 54797718, 54797718, 54935932, 55212436, 55489153, 55780599, 55935914, 55935914, 56212418,
56489135, 56780581, 57072027, 57072027, 57210279, 57486996, 57778442, 58069888, 58208391, 58208391, 58485108,
58776554, 59068000, 59344717, 59344717, 59483220, 59774666, 59774666, 59774666, 59774666, 59774666, 59774666,
59774666, 59774666, 59774666, 59774666, 59774666, 59774666, 59774666, 59774666, 59774666, 59774666, 60066112,
60342829, 60619333, 60896050, 60896050, 60896050, 61172767, 61449271, 61725988, 62017434, 62017434, 62155648,
62432152, 62708869, 63000315, 63155630, 63155630, 63432134, 63708851, 64000297, 64291743, 64291743, 64429995,
64706712, 64998158, 65289604, 65428107, 65428107, 65704824, 65996270, 66287716, 66564433, 66564433, 66702936,
66994382, 67285828, 67562545, 67700797, 67700797, 67992243, 67992243, 67992243, 67992243, 67992243, 67992243,
67992243, 67992243, 67992243, 67992243, 67992243, 67992243, 67992243, 67992243, 67992243, 67992243, 67992243,
68268960, 68545464, 68822181, 69113627, 69113627, 69251841, 69528345, 69805062, 70096508, 70251823, 70251823,
70528327, 70805044, 71096490, 71387936, 71387936, 71526188, 71802905, 72094351, 72385797, 72524300, 72524300,
72801017, 73092463, 73383909, 73660626, 73660626, 73799129, 74090575, 74382021, 74658738, 74796990, 74796990,
75088436, 75379882, 75656599, 75933103, 75933103, 76088418, 76088418, 76088418, 76088418, 76088418, 76088418,
76088418, 76088418, 76088418, 76088418, 76088418, 76088418, 76088418, 76088418, 76088418, 76088418, 76088418,
76088418, 76088418, 76088418, 76088418, 76088418, 76088418, 76088418, 76088418, 76088418, 76088418, 76088418,
76088418, 76088418, 76088418, 76088418, 76088418, 76088418, 76088418, 76088418, 76088418, 76088418, 76088418,
76088418, 76088418, 76088418, 76088418, 76088418, 76088418, 76088418, 76088418, 76088418, 76088418, 76088418,
76088418, 76088418, 76088418, 76088418, 76088418, 76088418, 76088418, 76088418, 76088418, 76088418, 76088418,
76088418, 76088418, 76088418, 76088418, 76088418, 76088418, 76088418, 76088418, 76088418, 76088418, 76088418,
76088418, 76088418, 76088418, 76088418, 76088418, 76088418, 76088418, 76088418, 76088418, 76088418, 76088418,
76088418, 76088418, 76088418, 76088418, 76088418, 76088418, 76088418, 76088418, 76088418, 76088418, 76088418,
76088418, 76088418, 76088418, 76088418, 76088418, 76088418, 76088418, 76088418, 76088418, 76088418, 76088418,
76088418, 76088418, 76088418, 76088418, 76088418, 76088418, 76088418, 76088418, 76088418, 76088418, 76088418,
76088418, 76088418, 76088418, 76088418, 76088418, 76088418, 76088418, 76088418, 76088418, 76088418, 76088418,
76088418, 76088418, 76088418, 76088418, 76088418, 76088418, 76088418, 76088418, 76088418, 76088418, 76088418,
76088418, 76088418, 76088418, 76088418, 76088418, 76088418, 76088418, 76088418, 76088418, 76088418, 76088418,
76088418, 76088418, 76088418, 76088418, 76088418, 76088418, 76088418, 76088418, 76088418, 76088418, 76088418,
76088418, 76088418, 76365135, 76641639, 76918356, 77209802, 77209802, 77348016, 77624520, 77901237, 78192683,
78192683, 78192683, 78192683, 78192683, 78192683, 78192683, 78192683, 78192683, 78192683, 78192683, 78192683,
78192683, 78192683, 78192683, 78192683, 78484129, 78760846, 78760846, 78899349, 79190795, 79482241, 79758958,
79897210, 79897210, 80188656, 80480102, 80756819, 81033323, 81033323, 81188638, 81480084, 81756801, 82033305,
82171519, 82171519, 82462965, 82739682, 83016186, 83292903, 83292903, 83292903, 83569620, 83846124, 84122841,
84414287, 84414287, 84552501, 84829005, 85105722, 85397168, 85552483, 85552483, 85828987, 86105704, 86397150,
86397150, 86397150, 86397150, 86397150, 86397150, 86397150, 86397150, 86397150, 86397150, 86397150, 86397150,
86397150, 86397150, 86397150, 86397150, 86688596, 86965313, 87103565, 87103565, 87395011, 87686457, 87963174,
88239678, 88239678, 88394993, 88686439, 88963156, 89239660, 89377874, 89377874, 89669320, 89946037, 90222541,
90499258, 90499258, 90499258, 90775975, 91052479, 91329196, 91620642, 91620642, 91758856, 92035360, 92312077,
92603523, 92758838, 92758838, 93035342, 93312059, 93603505, 93894951, 93894951, 94033203, 94309920, 94601366,
94601366, 94601366, 94601366, 94601366, 94601366, 94601366, 94601366, 94601366, 94601366, 94601366, 94601366,
94601366, 94601366, 94601366, 94601366, 94892812, 95169529, 95446033, 95446033, 95601348, 95892794, 96169511,
96446015, 96584229, 96584229, 96875675, 97152392, 97428896, 97705613, 97705613, 97705613, 97982330, 98258834,
98535551, 98826997, 98826997, 98965211, 99241715, 99518432, 99809878, 99965193, 99965193, 100241697, 100518414,
100809860, 101101306, 101101306, 101239558, 101516275, 101807721, 102099167, 102237670, 102237670, 102514387, 102805833,
102805833, 102805833, 102805833, 102805833, 102805833, 102805833, 102805833, 102805833, 102805833, 102805833, 102805833,
102805833, 102805833, 102805833, 102805833, 103097279, 103373996, 103650500, 103788714, 103788714, 104080160, 104356877,
104633381, 104910098, 104910098, 104910098, 105186815, 105463319, 105740036, 106031482, 106031482, 106169696, 106446200,
106722917, 107014363, 107169678, 107169678, 107446182, 107722899, 108014345, 108305791, 108305791, 108444043, 108720760,
109012206, 109303652, 109442155, 109442155, 109718872, 110010318, 110301764, 110578481, 110578481, 110716984, 111008430,
111008430, 111008430, 111008430, 111008430, 111008430, 111008430, 111008430, 111008430, 111008430, 111008430, 111008430,
111008430, 111008430, 111008430, 111008430, 111299876, 111576593, 111853097, 112129814, 112129814, 112129814, 112406531,
112683035, 112959752, 113251198, 113251198, 113389412, 113665916, 113942633, 114234079, 114389394, 114389394, 114665898,
114942615, 115234061, 115525507, 115525507, 115663759, 115940476, 116231922, 116523368, 116661871, 116661871, 116938588,
117230034, 117521480, 117798197, 117798197, 117936700, 118228146, 118519592, 118796309, 118934561, 118934561, 119226007,
119226007, 119226007, 119226007, 119226007, 119226007, 119226007, 119226007, 119226007, 119226007, 119226007, 119226007,
119226007, 119226007, 119226007, 119226007, 119226007, 119502724, 119779228, 120055945, 120347391, 120347391, 120485605,
120762109, 121038826, 121330272, 121485587, 121485587, 121762091, 122038808, 122330254, 122621700, 122621700, 122759952,
123036669, 123328115, 123619561, 123758064, 123758064, 124034781, 124326227, 124617673, 124894390, 124894390, 125032893,
125324339, 125615785, 125892502, 126030754, 126030754, 126322200, 126613646, 126890363, 127166867, 127166867, 127322182,
127322182, 127322182, 127322182, 127322182, 127322182, 127322182, 127322182, 127322182, 127322182, 127322182};
void db(){//此函数为打表函数,用于为wel数组赋初始值
ll cot=0,tot=0,tom=0;
for(ll i=1;i<=2e9;i++){
if(check(i))cot++;
tot++;
// tom++;
if(tot==2e6){
cout<<cot<<", ";
tot=0;
fflush(stdout);
tom++;
}
if(tom==11){
tom=0;
cout<<endl;
}
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
ll a,b;
cin>>a>>b;
ll ans=0;
ll ia=a/(ll)2e6;//计算a和b所处的区间范围
ll ib=b/(ll)2e6;
if(ia==ib){//若a、b同处于长度为2e6的区间,则直接遍历
for(ll i=a;i<=b;i++){
if(check(i))ans++;
}
}
else{//否则,利用wel数组来快速求出中间区间的值
// ans=ans+wel[ib-1]-wel[ia];
ll ansa=0,ansb=0;
for(ll i=ia*2e6+1;i<=a-1;i++){
if(check(i))ansa++;
}
// if(ia)ansa+=wel[]
ans=ans+wel[ia+1]-wel[ia]-ansa;
ans=ans+wel[ib]-wel[ia+1];
for(ll i=ib*2e6+1;i<=b;i++){
if(check(i))ansb++;
}
ans+=ansb;
}
cout<<ans;
// db();
return 0;
}