P4124 [CQOI2016]手機號碼

1522713-20191101204557783-1396221591.png

#include <bits/stdc++.h>
#define int long long
using namespace std ;
int l , r , num[15] ;
int f[15][15][15][2][2][2][2] ;
int dfs(int p ,int a ,int b ,int c ,int d ,int _4 ,int _8 ) {
    //p位數,p+1位是a,p+2位是b,是否滿足條件一,當前位數是否大於n,是否滿足條件二 
    if(_4&&_8) return 0 ;//不合法貢獻爲0
    if(p <= 0) return c ;//如果位數枚舉完了,如果有貢獻就返回一,沒有貢獻就返回0
    if(~f[p][a][b][c][d][_4][_8]) return f[p][a][b][c][d][_4][_8] ;//返回貢獻
    int res = 0 ;int lim = !d ? num[p] : 9 ;//如果當前位嚴格小於最高位,那就可以隨便填,否則只能從num填
    for(int i = 0 ; i <= lim ; i ++) {
        res += dfs(p-1,i,a,c||(i==a&&i==b),d||(i<lim),_4||(i==4),_8||(i==8)) ;
    } 
    return f[p][a][b][c][d][_4][_8] = res ;
//  return res ;
}
int calc(int x) {
    if(x < 1e10) return  0 ;
    int len = 0 ;
    while(x) {
        num[++len] = x % 10 ;
        x /= 10 ;
    }
    memset(f,-1,sizeof(f)) ;
    int res = 0 ;
//  cout << len << endl ;
    for(int i = 1 ; i <= num[len] ; i ++) {
        res += dfs(10,i,0,0,i<num[len],i==4,i==8) ;
    }return res ;
}
signed main () {
    cin >> l >> r ;
    cout << calc(r) - calc(l-1) << endl ; 
    return 0 ;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章