제출 #1174509

#제출 시각아이디문제언어결과실행 시간메모리
1174509turnejaPalindrome-Free Numbers (BOI13_numbers)C++20
100 / 100
1 ms328 KiB
#include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> using namespace std; using namespace __gnu_pbds; #define endl "\n" #define ll long long #define IOS ios_base::sync_with_stdio(false); cin.tie(nullptr); long long dp[20][11][11][3]; long long calc(long long n) { if (n == -1) { return 0; } if (n == 0) { return 1; } vector<int> b; while (n > 0) { b.push_back(n % 10); n /= 10; } reverse(b.begin(), b.end()); for (int d = 1; d < 10; d++) { if (d < b[0]) { dp[0][10][d][0] = 1; } else if (d == b[0]) { dp[0][10][d][2] = 1; } else { dp[0][10][d][1] = 1; } } for (int i = 1; i < b.size(); i++) { for (int j = 0; j <= 10; j++) { for (int k = 0; k <= 10; k++) { for (int d = 0; d < 10; d++) { if (j == k || j == d || k == d) { continue; } if (d < b[i]) { dp[i][k][d][0] += dp[i - 1][j][k][0] + dp[i - 1][j][k][2]; dp[i][k][d][1] += dp[i - 1][j][k][1]; } else if (d == b[i]) { dp[i][k][d][0] += dp[i - 1][j][k][0]; dp[i][k][d][1] += dp[i - 1][j][k][1]; dp[i][k][d][2] += dp[i - 1][j][k][2]; } else { dp[i][k][d][1] += dp[i - 1][j][k][1] + dp[i - 1][j][k][2]; dp[i][k][d][0] += dp[i - 1][j][k][0]; } } } } } long long ans = 0; for (int i = 0; i < b.size(); i++) { for (int j = 0; j <= 10; j++) { for (int k = 0; k <= 10; k++) { if (i < b.size() - 1) { ans += dp[i][j][k][0] + dp[i][j][k][1] + dp[i][j][k][2]; } else { ans += dp[i][j][k][0] + dp[i][j][k][2]; } dp[i][j][k][0] = 0, dp[i][j][k][1] = 0, dp[i][j][k][2] = 0; } } } return ans + 1; } int main() { IOS; long long l, r; cin >> l >> r; cout << calc(r) - calc(l - 1); return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...