Submission #666878

#TimeUsernameProblemLanguageResultExecution timeMemory
666878mnbvcxz123Palindrome-Free Numbers (BOI13_numbers)C++17
100 / 100
1 ms340 KiB
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
vector<int>num;
ll dp[30][12][12][2];

ll get(int pos, int p1, int p2, int f){
        if(pos==num.size())
                return 1;
        if(dp[pos][p1][p2][f]!=-1)
                return dp[pos][p1][p2][f];
        int lim=9;
        if(!f)
                lim=num[pos];
        ll res=0;
        for(int dgt=0;dgt<=lim;++dgt){
                if(p1==11 and p2==11)
                        res+=get(pos+1,dgt==0?11:dgt,11,(f or dgt<lim));
                else if(dgt!=p1 and dgt!=p2)
                        res+=get(pos+1,dgt,p1,(f or dgt<lim));
        }
        return dp[pos][p1][p2][f]=res;
}

ll solve(ll n){
        if(n<0)
                return 0;
        if(n==0)
                return 1;
        num.clear();
        while(n){
                num.emplace_back(n%10);
                n/=10;
        }
        reverse(num.begin(),num.end());
        memset(dp,-1,sizeof(dp));
        return get(0,11,11,0);
}

int main(){
        ios::sync_with_stdio(false);
        cin.tie(nullptr);
        cout.tie(nullptr);
        ll a,b;
        cin>>a>>b;
        cout<<solve(b)-solve(a-1);
}

Compilation message (stderr)

numbers.cpp: In function 'll get(int, int, int, int)':
numbers.cpp:8:15: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
    8 |         if(pos==num.size())
      |            ~~~^~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...