Submission #755445

#TimeUsernameProblemLanguageResultExecution timeMemory
755445The_SamuraiPalindrome-Free Numbers (BOI13_numbers)C++17
100 / 100
1 ms340 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; ll atoill(string s) { ll ans = 0; for (int i = 0; i < s.size(); i++) { ans = ans * 10 + (s[i] - '0'); } return ans; } bool check(ll n) { string s = to_string(n); for (int i = 0; i < s.size(); i++) { if (i + 1 < s.size() and s[i] == s[i + 1]) return false; if (i + 2 < s.size() and s[i] == s[i + 2]) return false; } return true; } int get(ll l, ll r) { int ans = 0; for (ll i = l; i <= r; i++) ans += check(i); return ans; } ll pw(int a, int b) { ll ans = 1; for (int i = 0; i < b; i++) ans *= a; return ans; } ll dp(string s) { int n = s.size(), cnt = 0; for (int i = 0; i < n; i++) { if (s[i] == '*') break; if (i + 1 < n and s[i] == s[i + 1]) return 0; if (i + 2 < n and s[i] == s[i + 2]) return 0; cnt++; } if (cnt == 0) { return pw(9, 2) * pw(8, n - 2); } if (cnt == 1) { return pw(9, 1) * pw(8, n - 2); } return pw(8, n - cnt); } ll get(ll n) { if (n < 0) return 0; if (n < 10) return n + 1; ll ans = 10; int len = to_string(n).size(); for (int i = 2; i < len; i++) ans += dp(string(i, '*')); string s = to_string(n), t = ""; for (int i = 0; i < len; i++) { for (char x = '0'; x < s[i]; x++) { if (i == 0 and x == '0') continue; t += x; ans += dp(t + string(len - i - 1, '*')); t.pop_back(); } t += s[i]; } if (check(n)) ans++; return ans; } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); ll l, r; cin >> l >> r; //#ifdef sunnitov // cerr << get(l, r) << endl; //#endif cout << get(r) - get(l - 1); return 0; }

Compilation message (stderr)

numbers.cpp: In function 'll atoill(std::string)':
numbers.cpp:8:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
    8 |     for (int i = 0; i < s.size(); i++) {
      |                     ~~^~~~~~~~~~
numbers.cpp: In function 'bool check(ll)':
numbers.cpp:16:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   16 |     for (int i = 0; i < s.size(); i++) {
      |                     ~~^~~~~~~~~~
numbers.cpp:17:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   17 |         if (i + 1 < s.size() and s[i] == s[i + 1]) return false;
      |             ~~~~~~^~~~~~~~~~
numbers.cpp:18:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   18 |         if (i + 2 < s.size() and s[i] == s[i + 2]) return false;
      |             ~~~~~~^~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...