이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pii pair <int, int>
#define fi first
#define se second
#define mp make_pair
const int NM = 19;
int n, f[NM+5][2][2][11][11], ans = 0;
string a, b;
pii trans(string &a, string &b, int i, int j, int k, int d){
if (j == 1 && k == 1) return mp(1, 1);
if (j == 0 && k == 1){
if (d < a[i+1]) return mp(-1, -1);
if (d == a[i+1]) return mp(0, 1);
return mp(1, 1);
}
if (j == 1 && k == 0){
if (d > b[i+1]) return mp(-1, -1);
if (d == b[i+1]) return mp(1, 0);
return mp(1, 1);
}
if (d < a[i+1] || d > b[i+1]) return mp(-1, -1);
if (d == a[i+1] && d == b[i+1]) return mp(0, 0);
if (d == a[i+1]) return mp(0, 1);
if (d == b[i+1]) return mp(1, 0);
return mp(1, 1);
}
int solve(string a, string b){
n = a.size();
for (int i = 0; i < n; i++)
a[i] -= '0', b[i] -= '0';
memset(f, 0, sizeof(f));
if (a[0] == b[0]){
f[0][0][0][10][a[0]] = 1;
}
else{
f[0][0][1][10][a[0]] = 1;
f[0][1][0][10][b[0]] = 1;
for (int i = a[0]+1; i < b[0]; i++)
f[0][1][1][10][i]++;
}
for (int i = 0; i < n-1; i++)
for (int j = 0; j < 2; j++)
for (int k = 0; k < 2; k++)
for (int d1 = 0; d1 <= 10; d1++)
for (int d2 = 0; d2 <= 10; d2++){
if (f[i][j][k][d1][d2] == 0) continue;
for (int d = 0; d <= 9; d++){
if (d == d1 || d == d2) continue;
pii P = trans(a, b, i, j, k, d);
if (P.fi == -1) continue;
f[i+1][P.fi][P.se][d2][d] += f[i][j][k][d1][d2];
}
}
int res = 0;
for (int j = 0; j < 2; j++)
for (int k = 0; k < 2; k++)
for (int d1 = 0; d1 <= 10; d1++)
for (int d2 = 0; d2 <= 10; d2++)
res += f[n-1][j][k][d1][d2];
return res;
}
signed main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> a >> b;
if (a == "0" && b == "0"){
cout << 1;
return 0;
}
if (a == "0"){
ans++;
a = "1";
}
if (a.size() == b.size()){
cout << solve(a, b);
return 0;
}
string s = "";
for (int i = 0; i < a.size(); i++) s.push_back('9');
ans += solve(a, s);
s = "1";
for (int i = 1; i < b.size(); i++) s.push_back('0');
ans += solve(s, b);
for (int i = a.size()+1; i < b.size(); i++){
string s1 = "1", s2 = "";
for (int j = 0; j < i; j++){
if (j > 0) s1.push_back('0');
s2.push_back('9');
}
ans += solve(s1, s2);
}
cout << ans;
return 0;
}
컴파일 시 표준 에러 (stderr) 메시지
numbers.cpp: In function 'long long int solve(std::string, std::string)':
numbers.cpp:40:22: warning: array subscript has type 'char' [-Wchar-subscripts]
40 | f[0][0][0][10][a[0]] = 1;
| ^
numbers.cpp:43:22: warning: array subscript has type 'char' [-Wchar-subscripts]
43 | f[0][0][1][10][a[0]] = 1;
| ^
numbers.cpp:44:22: warning: array subscript has type 'char' [-Wchar-subscripts]
44 | f[0][1][0][10][b[0]] = 1;
| ^
numbers.cpp: In function 'int main()':
numbers.cpp:88:20: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
88 | for (int i = 0; i < a.size(); i++) s.push_back('9');
| ~~^~~~~~~~~~
numbers.cpp:91:20: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
91 | for (int i = 1; i < b.size(); i++) s.push_back('0');
| ~~^~~~~~~~~~
numbers.cpp:93:29: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
93 | for (int i = a.size()+1; i < b.size(); i++){
| ~~^~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |