제출 #253412

#제출 시각아이디문제언어결과실행 시간메모리
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"; }

컴파일 시 표준 에러 (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...