状态:
d
p
[
i
]
[
j
]
[
k
]
[
l
]
[
m
]
[
n
]
[
o
]
→
dp[i][j][k][l][m][n][o]\to
dp[i][j][k][l][m][n][o]→ 目前搜到第i位, 上两位填的数分别是j和k, 以及目前这个数符不符合题意l, 有没有前导零m, 填过8没有n,填过4没有;
目标:
(
s
u
m
[
r
]
)
(
s
u
m
[
i
]
代
表
1
i
内
的
所
有
合
法
数
的
个
数
)
(sum[r])(sum[i]代表1~i内的所有合法数的个数)
(sum[r])(sum[i]代表1i内的所有合法数的个数)
@author: jasonleft 记忆化数位
#include<bits/stdc++.h>#include<bits/extc++.h>#define _rep(i, a, b) for (ll i = (a); i <= (b); ++i)#define _rev(i, a, b) for (ll i = (a); i >= (b); --i)#define _for(i, a, b) for (ll i = (a); i < (b); ++i)#define _rof(i, a, b) for (ll i = (a); i > (b); --i)#define ll long long#define db double#define oo 0x3f3f3f3f#define eps 0.00001#define all(x) x.begin(), x.end()#define met(a, b) memset(a, b, sizeof(a))#define id(x) ((x + 8))#define bin(x) cerr << #x << " is " << bitset<15>(x) << endl#define what_is(x) cerr << #x << " is " << x << endl#define lowbit(x) x &(-x)usingnamespace std;const ll maxn =15;
ll l, r, dp[maxn][maxn][maxn][2][2][2][2], cnt, a[maxn];
ll dfs(ll cur, ll last, ll llst, ll up,bool fine,bool eight,bool four,bool zeros){if(cur ==0)return fine;
ll &t = dp[cur][last][llst][fine][zeros][eight][four];if(!up &&~t)return t;
ll ret =0;_rep(i,0, up ? a[cur]:9){if((eight && i ==4)||(four && i ==8))continue;
ret +=dfs(cur -1,zeros && i ==0?-1: i,zeros && i ==0?-1: last, up && i == a[cur], fine ||(last == i && last == llst), eight || i ==8, four || i ==4, zeros && i ==0);}if(!up)
t = ret;assert(ret >=0);return ret;}
ll ask(ll __){
cnt =0;met(a,0);//, met(dp, -1);while(__)
a[++cnt]= __ %10, __ /=10;returndfs(cnt,-1,-1,1,0,0,0,1);}signedmain(){
ios::sync_with_stdio(0);
cin >> l >> r;met(dp,-1);
cout <<ask(r)-ask(l -1)<< endl;}