#include <bits/stdc++.h>
using namespace std;
#define int long long
string a, b;
int dfs(int i, bool big, bool lit, char last_1, char last_2){
if(i == b.size()) return 1;
if(big and lit){
int rest = b.size()-i-1;
if(last_1 == '%') return 9*pow(8, rest);
return pow(8, rest+1);
}
if(lit){
int cnt = '9'-a[i];
if(a[i]+1 <= last_1 and last_1 <= '9') cnt--;
if(a[i]+1 <= last_2 and last_2 <= '9') cnt--;
if(cnt < 0) cnt = 0;
return cnt * dfs(i+1, true, true, last_2, '9') + dfs(i+1, big, lit, last_2, a[i]);
}
if(big){
int cnt = b[i]-'0';
if('0' <= last_1 and last_1 <= b[i]-1) cnt--;
if('0' <= last_2 and last_2 <= b[i]-1) cnt--;
if(cnt < 0) cnt = 0;
return cnt * dfs(i+1, true, true, last_2, '0') + dfs(i+1, big, lit, last_2, b[i]);
}
if(a[i] == b[i]) return dfs(i+1, false, false, last_2, a[i]);
int res = 0;
int cnt = b[i]-a[i]-1;
if(a[i]+1 <= last_1 and last_1 <= b[i]-1) cnt--;
if(a[i]+1 <= last_2 and last_2 <= b[i]-1) cnt--;
res += dfs(i+1, true, true, last_2, a[i]+1) * cnt;
if(last_2 != a[i] and last_1 != a[i]) res += dfs(i+1, false, true, last_2, a[i]);
if(last_2 != b[i] and last_1 != b[i]) res += dfs(i+1, true, false, last_2, b[i]);
return res;
}
void solve(){
cin >> a >> b;
while(a.size() < b.size()) a = '0' + a;
for(int i=0; i<b.size(); i++){
if(a[i] != b[i]) break;
if(i and a[i-1] == b[i-1]){
cout << 0;
return;
}
if(i>1 and a[i-2] == b[i-2] and a[i] == a[i-2]){
cout << 0;
return;
}
}
cout << dfs(0, false, false, '%', '%') << '\n';
}
signed main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
solve();
}
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |