Submission #253416

#TimeUsernameProblemLanguageResultExecution timeMemory
253416tvthanhPalindrome-Free Numbers (BOI13_numbers)C++14
50.83 / 100
1 ms512 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[11][11][MAX_DIGITS][2]; vector<int> num; int curr_num[MAX_DIGITS]; ll backtrack(int prev1, int prev2, int pos, int state){ if (pos >= num.size()) return 1; if(dp[prev1][prev2][pos][state] != -1) return dp[prev1][prev2][pos][state]; int limit = 0; if(state == 0){ limit = num[pos]; } else { limit = 9; } ll res = 0; for(int i = 0; i <= limit; i++){ int nstate = state; if (i < limit) nstate = 1; if (i != prev1 && i != prev2) res += backtrack(i, prev1, pos + 1, nstate); } dp[prev1][prev2][pos][state] = res; return dp[prev1][prev2][pos][state]; } ll solve(int x){ if (x < 0) return 0; 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; memset(dp, -1, sizeof(dp)); for(int d = 1; d <= num[0]; d++){ res += backtrack(d, d, 1, d != num[0]); } for(int k = 2; k <= num.size(); k++){ for(int d = 1; d <= 9; d++){ res += backtrack(d, d, k, 1); } } return res; } int main(){ cin >> a >> b; cout << solve(b) - solve(a - 1) << "\n"; }

Compilation message (stderr)

numbers.cpp: In function 'll backtrack(int, int, int, int)':
numbers.cpp:16:13: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     if (pos >= num.size())
         ~~~~^~~~~~~~~~~~~
numbers.cpp: In function 'll solve(int)':
numbers.cpp:53:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int k = 2; k <= num.size(); k++){
                    ~~^~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...