제출 #944224

#제출 시각아이디문제언어결과실행 시간메모리
944224Zero_OPPalindrome-Free Numbers (BOI13_numbers)C++14
100 / 100
1 ms568 KiB
#include<bits/stdc++.h> using namespace std; using int64 = int64_t; #define REP(i, n) for(int i = 0, _n = n; i < _n; ++i) #define REPD(i, n) for(int i = n - 1; i >= 0; --i) #define FOR(i, l, r) for(int i = l, _r = r; i <= _r; ++i) #define FORD(i, r, l) for(int i = r, _l = l; i >= _l; --i) #define left __left #define right __right #define prev __prev #define next __next #define div __div #define pb push_back #define pf push_front #define sz(v) (int)v.size() #define range(v) begin(v), end(v) #define compact(v) v.erase(unique(range(v)), end(v)) #define debug(v) "[" #v " = " << (v) << "]" template<typename T> bool minimize(T& a, const T& b){ if(a > b){ a = b; return true; } return false; } template<typename T> bool maximize(T& a, const T& b){ if(a < b){ a = b; return true; } return false; } template<int dimension, class T> struct vec : public vector<vec<dimension - 1, T>> { static_assert(dimension > 0, "Dimension must be positive !\n"); template<typename... Args> vec(int n = 0, Args... args) : vector<vec<dimension - 1, T>>(n, vec<dimension - 1, T>(args...)) {} }; template<class T> struct vec<1, T> : public vector<T> { vec(int n = 0, T val = T()) : vector<T>(n, val) {} }; void init(void); void process(void); int main(){ ios_base::sync_with_stdio(0); cin.tie(0); #define task "antuvu" if(fopen(task".inp", "r")){ freopen(task".inp", "r", stdin); freopen(task".out", "w", stdout); } int T = 1; //cin >> T; while(T--) { init(); process(); } return 0; } int64 L, R, dp[30][2][2][12][12]; int64 calculate(vector<int>& digits, int pos, bool leading_zeroes, bool tight, int second_last_digit, int last_digit){ if(pos == sz(digits)) return 1; int64& cur = dp[pos][leading_zeroes][tight][second_last_digit][last_digit]; if(cur != -1) return cur; cur = 0; int lim = (tight ? digits[pos] : 10); FOR(i, 1, lim){ if(leading_zeroes){ cur += calculate(digits, pos + 1, leading_zeroes & (i == 1), tight & (i == lim), 0, i); } else{ if(second_last_digit != i and last_digit != i){ cur += calculate(digits, pos + 1, leading_zeroes & (i == 1), tight & (i == lim), last_digit, i); } } } return cur; } int64 solve(int64 N){ vector<int> digits; while(N > 0){ digits.pb(N % 10 + 1); N /= 10; } reverse(range(digits)); memset(dp, -1, sizeof(dp)); return calculate(digits, 0, true, true, 0, 0); } void init(){ cin >> L >> R; } void process(){ if(L > 0) cout << solve(R) - solve(L - 1) << '\n'; else cout << solve(R) << '\n'; }

컴파일 시 표준 에러 (stderr) 메시지

numbers.cpp: In function 'int main()':
numbers.cpp:60:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   60 |         freopen(task".inp", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
numbers.cpp:61:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   61 |         freopen(task".out", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...