Submission #253412

#TimeUsernameProblemLanguageResultExecution timeMemory
253412tvthanhPalindrome-Free Numbers (BOI13_numbers)C++14
78.75 / 100
1 ms384 KiB
#include <bits/stdc++.h>

using namespace std;
#define loop(i, a, b) for (int i = (a); i < (b); i++)
typedef long long ll;

const int MAX_DIGITS = 20;
ll cnt[MAX_DIGITS][10];
ll cnt_digits[MAX_DIGITS];
ll a, b;
ll dp[MAX_DIGITS][11][11][2];
vector<int> num;
int curr_num[MAX_DIGITS];

ll backtrack(int pos, int prev1, int prev2, int state)
{
    if (pos == num.size())
        return 1;
    if (dp[pos][prev1][prev2][state] != -1)
    {
        return dp[pos][prev1][prev2][state];
    }
    int limit;
    if (state == 0)
        limit = num[pos];
    else
    {
        limit = 9;
    }
    ll res = 0;
    int start;
    if (pos == 0)
    {
        start = 1;
    } else
    {
        start = 0;
    }

    for (int i = start; i <= limit; i++)
    {
        int nstate = state;
        if (i < limit)
            nstate = 1;
        if (i != prev1 && i != prev2)
            res += backtrack(pos + 1, i, prev1, nstate);
    }
    dp[pos][prev1][prev2][state] = res;
    return dp[pos][prev1][prev2][state];
}
ll solve(ll x){
    num.clear();
    while (x > 0){
        num.push_back(x % 10);
        x = x / 10;
    }
    reverse(num.begin(), num.end());
    ll res = 1;
    if (num.size() == 0)
        return res;
    loop(i, 1, num.size()) res += cnt_digits[i];
    memset(dp, -1, sizeof(dp));
    res += backtrack(0, 10, 10, 0);
    return res;
}
int main()
{
    cin >> a >> b;
    loop(i, 1, 10)
    {
        cnt[1][i] = 1;
    }
    loop(pos, 2, MAX_DIGITS)
    {
        loop(i, 0, 10)
        {
            loop(d, 0, 10)
            {
                if (d != i)
                    cnt[pos][i] += cnt[pos - 1][d] - cnt[pos - 2][i];
            }
        }
    }
    loop(i, 1, MAX_DIGITS)
    {
        loop(j, 0, 10)
            cnt_digits[i] += cnt[i][j];
    }
    // cout << cnt_digits[4] << "\n";
    ll ans;
    if (a == 0){
        if ( b == 0)
            ans = 0;
        else
            ans = solve(b);
    } else
        ans = solve(b) - solve(a - 1);
    cout << ans << "\n";
}

Compilation message (stderr)

numbers.cpp: In function 'll backtrack(int, int, int, int)':
numbers.cpp:17:13: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     if (pos == num.size())
         ~~~~^~~~~~~~~~~~~
numbers.cpp: In function 'll solve(ll)':
numbers.cpp:4:43: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
 #define loop(i, a, b) for (int i = (a); i < (b); i++)
                                           ^
numbers.cpp:61:5: note: in expansion of macro 'loop'
     loop(i, 1, num.size()) res += cnt_digits[i];
     ^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...