Submission #1180785

#TimeUsernameProblemLanguageResultExecution timeMemory
1180785petezaPalindrome-Free Numbers (BOI13_numbers)C++20
78.75 / 100
0 ms328 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;

ll x, y;
ll dp[22][12][12][2];
ll pow10[22];
ll cur;
int vals[22];

int getdig(ll a, int dig) {
    return (a/pow10[dig])%10;
}

ll rec(int pos, int i ,int j, int mode) {
    if(pos < 0) return 1;
    if(dp[pos][i][j][mode] != -1) return dp[pos][i][j][mode];
    dp[pos][i][j][mode] = 0;
    if(mode) {
        int cdig = vals[pos];
        for(int k=0;k<cdig;k++) {
            dp[pos][i][j][mode] += rec(pos-1, j, k, 0) * (ll)(i != k && j != k);
        }
        dp[pos][i][j][mode] += rec(pos-1, j, cdig, 1) * (ll)(i != cdig && j != cdig);
    } else {
        for(int k=0;k<=9;k++)
            dp[pos][i][j][mode] += rec(pos-1, j, k, 0) * (ll)(i != k && j != k);
    }
    return dp[pos][i][j][mode];
}

int gsz(ll a) {
    int sum = 0;
    while(a) {a/=10; sum++;}
    return sum;
}

ll ans(ll a) {
    if(a == 0) return 1;
    if(a < 0) return 0;
    memset(dp, -1, sizeof dp);
    int sz = gsz(a)-1;
    ll ans = 0;
    for(int i=0;i<=18;i++) vals[i] = getdig(a, i);
    for(int i=1;i<vals[sz];i++) ans += rec(sz-1, 10, i, 0);
    ans += (sz == 0 ? 0 : rec(sz-1, 10, 10, 0));
    //cout << ans << '\n';
    ans += rec(sz-1, 10, vals[sz], 1);
    return ans;
}

int main() {
    pow10[0] = 1;
    for(int i=1;i<=18;i++) pow10[i] = pow10[i-1] * 10;
    cin >> x >> y;
    cout << ans(y) - ans(x-1);
}

Compilation message (stderr)

numbers.cpp:7:4: warning: built-in function 'pow10' declared as non-function [-Wbuiltin-declaration-mismatch]
    7 | ll pow10[22];
      |    ^~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...