Submission #83249

#TimeUsernameProblemLanguageResultExecution timeMemory
83249teomrnPalindrome-Free Numbers (BOI13_numbers)C++14
100 / 100
3 ms980 KiB
#include <bits/stdc++.h>
using namespace std;

typedef long long i64;

int cifre[20];
i64 dp[20][11][11][2];


i64 solve(i64 nr)
{
    if (nr == 0)
        return 1;
    if (nr < 0)
        return 0;

    int n = 0;
    while (nr) {
        cifre[++n] = nr % 10 + 1;
        nr /= 10;
    }
    reverse(cifre + 1, cifre + n + 1);
    memset(dp, 0, sizeof dp);

    dp[0][0][0][1] = 1;

    for (int i = 1; i <= n; i++) {
        for (int j = 0; j <= 10; j++) {
            for (int k = 0; k <= 10; k++) {
                if ((k == 0 && j != 0) || (k != 0 && k == j) || (j == 0 && k == 1))
                    continue; /// pozitie ilegala
                for (int last = 0; last <= 10; last++) {
                    if (last == k && last != 0)
                        continue;
                    if (k == cifre[i])
                        dp[i][j][k][1] += dp[i - 1][last][j][1];
                    else if (k < cifre[i])
                        dp[i][j][k][0] += dp[i - 1][last][j][1];
                    dp[i][j][k][0] += dp[i - 1][last][j][0];
                }
            }
        }
    }

    i64 ans = 0;
    for (int j = 0; j <= 10; j++)
        for (int k = 0; k <= 10; k++)
            ans += dp[n][j][k][0] + dp[n][j][k][1];
    return ans;
}


int main()
{
    i64 a, b;
    cin >> a >> b;
    i64 ans = solve(b);
    ans -= solve(a - 1);

    cout << ans << '\n';

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...