Submission #1214527

#TimeUsernameProblemLanguageResultExecution timeMemory
1214527GabrielPalindrome-Free Numbers (BOI13_numbers)C++20
100 / 100
1 ms584 KiB
#include "bits/stdc++.h"
using namespace std;
string Actual;
vector< vector< vector< vector< vector<long long> > > > > PD;
long long Resolver(long long Anterior_anterior, long long Anterior, long long i, long long Libre, long long Primero){
    if(i == Actual.size()) return 1;
    if(PD[Anterior_anterior][Anterior][i][Libre][Primero] != -2) return PD[Anterior_anterior][Anterior][i][Libre][Primero];
    long long r = -0;
    if(Libre == 1){
        for(long long j = Primero; j < 10; j++){
            if(j != Anterior_anterior and j != Anterior) r += Resolver(Anterior, j, i + 1, 1, 0);
        }
    } else {
        for(long long j = Primero; j <= Actual[i] - '0'; j++){
            if(j != Anterior_anterior and j != Anterior) r += Resolver(Anterior, j, i + 1, (long long)(j != Actual[i] - '0'), 0);
        }
    }
    return PD[Anterior_anterior][Anterior][i][Libre][Primero] = r;
}
long long Resolviendo(long long n){
    if(n < 0) return 0;
    if(n == 0) return 1;
    stringstream a;
    a<<n;
    a>>Actual;
    PD.assign(11, vector< vector< vector< vector<long long> > > >(11, vector< vector< vector<long long> > >(Actual.size(), vector< vector<long long> >(2, vector<long long>(2, -2)))));
    long long r = Resolver(10, 10, 0, 0, 1);
    for(long long i = 1; i <= Actual.size(); i++){
        r += Resolver(10, 10, i, 1, 1);
    }
    return r;
}
int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    long long a, b;
    cin>>a>>b;
    cout<<Resolviendo(b) - Resolviendo(a - 1);
    /*if(b - a > 222222) cout<<Resolviendo(b) - Resolviendo(a - 1);
    else {
        long long c = 0;
        for(long long i = a; i <= b; i++){
            long long j = i;
            stringstream zd;
            zd<<j;
            string Hola;
            zd>>Hola;
            bool Bien = 1;
            for(j = 0; j < Hola.size() - 1; j++){
                if(Hola[j] == Hola[j + 1]){
                    Bien = 0;
                    break;
                }
            }
            for(j = 0; j < Hola.size() - 2; j++){
                if(Hola[j] == Hola[j + 2]){
                    Bien = 0;
                    break;
                }
            }
            c += Bien;
        }
        cout<<c;
    }*/
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...