Submission #77207

#TimeUsernameProblemLanguageResultExecution timeMemory
77207Flying_dragon_02Palindrome-Free Numbers (BOI13_numbers)C++17
100 / 100
10 ms2300 KiB
#include <bits/stdc++.h>

using namespace std;

#define fi first
#define se second
#define pb push_back
#define mp make_pair

typedef pair<int, int> ii;

string a, b, s;

long long dp[21][15][15][21][2];

long long f(int pos, int num1, int num2, int fA, int fB) {
    if(pos == 20)
        return 1;
    long long ret = dp[pos][num1][num2][fA][fB];
    if(fB) {
        ret = 0;
        int l = 0, r = 9;
        if(fB) r = s[pos] - '0';
        for(int i = l; i <= r; i++) {
            int newA = fA, newB = 0;
            if(fA == 0 && i > 0) newA = pos;
            if(fB && i == r) newB = 1;
            if(newA >= 1 && abs(pos - newA) >= 1 && num1 == i) continue;
            if(newA >= 1 && abs(pos - newA) >= 2 && num2 == i) continue;
            ret += f(pos + 1, i, num1, newA, newB);
        }
        return ret;
    }
    else {
        if(ret >= 0) return ret;
        ret = 0;
        int l = 0, r = 9;
        for(int i = l; i <= r; i++) {
            int newA = fA, newB = 0;
            if(fA == 0 && i > 0) newA = pos;
            if(newA >= 1 && abs(pos - newA) >= 1 && num1 == i) continue;
            if(newA >= 1 && abs(pos - newA) >= 2 && num2 == i) continue;
            ret += f(pos + 1, i, num1, newA, newB);
        }
        dp[pos][num1][num2][fA][fB] = ret;
        return ret;
    }
}

long long get(string h) {
    while(h.length() <= 19)
        h = "0" + h;
    s = h;
    return f(1, 0, 0, 0, 1);
}

int main() {
    cin.tie(0), ios::sync_with_stdio(0);
    //freopen("Numbers.inp", "r", stdin);
    cin >> a >> b;
    for(int i = 0; i <= 20; i++) {
        for(int j = 0; j < 15; j++) {
            for(int k = 0; k < 15; k++) {
                for(int l = 0; l <= 20; l++) {
                    for(int o = 0; o < 2; o++)
                        dp[i][j][k][l][o] = -1;
                }
            }
        }
    }
    long long ans = get(b) - get(a);
    int ck = 0;
    for(int i = 1; i < a.length(); i++) {
        if(a[i] == a[i - 1])
            ck = 1;
    }
    for(int i = 2; i < a.length(); i++) {
        if(a[i] == a[i - 2])
            ck = 1;
    }
    if(ck == 0) ans++;
    cout << ans << "\n";
}

Compilation message (stderr)

numbers.cpp: In function 'int main()':
numbers.cpp:73:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i = 1; i < a.length(); i++) {
                    ~~^~~~~~~~~~~~
numbers.cpp:77:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i = 2; i < a.length(); i++) {
                    ~~^~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...