제출 #1142600

#제출 시각아이디문제언어결과실행 시간메모리
1142600h11mpelaPalindrome-Free Numbers (BOI13_numbers)C++20
100 / 100
1 ms328 KiB
#include <bits/stdc++.h>
#define ll long long
using namespace std;

ll ans(ll x){
    if(x <= 0) return x;
    vector <int> num;

    ll dp[20][11][11][2] = {0}; // pref, last1, last2, tight; 10 <=> digit doesnt exist
    while(x){
        num.push_back(x % 10);
        x /= 10;
    }
    reverse(num.begin(), num.end());
    int n = num.size();

    for(int i = 0; i < n; i++){
        for(int j = 1; j < 10; j++){
            if(i == 0 && j == num[i]){
                dp[i][10][j][1] = 1;
                break;
            }
            dp[i][10][j][0] = 1;
        }
        if(i == 0) continue;
        for(int j = 0; j < 10; j++)
            for(int k = 0; k < 10; k++)
                for(int l = 0; l <= 10; l++)
                    for(int z = 0; z < 2; z++)
                        if(j != k && j != l && !(z && j > num[i])) 
                            dp[i][k][j][z & (j == num[i])] += dp[i - 1][l][k][z];
                    
    }
    ll res = 0;
    for(int i = 0; i <= 10; i++)
        for(int j = 0; j <= 10; j++)
            res += dp[n - 1][i][j][0] + dp[n - 1][i][j][1];

    return res;
}

int main(){
    cin.tie(0);ios_base::sync_with_stdio(0);
    ll a, b; cin >> a >> b;
    cout << ans(b) - ans(a - 1);   
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...