제출 #253415

#제출 시각아이디문제언어결과실행 시간메모리
253415tvthanhPalindrome-Free Numbers (BOI13_numbers)C++14
50.83 / 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[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 = 1; k < num.size(); k++){ for(int d = 1; d <= 9; d++){ res += backtrack(d, d, k + 1, 1); } } return res; } int main(){ cin >> a >> b; cout << solve(b) - solve(a - 1) <<"\n"; }

컴파일 시 표준 에러 (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 = 1; k < num.size(); k++){
                    ~~^~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...