이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
#define ll long long
#define pii pair<int,int>
#define pll pair<ll,ll>
#define vi vector<int>
#define vl vector<ll>
#define mp make_pair
#define pb push_back
using namespace std;
ll set_on(int n, int k){
return (n |= 1 << k);
}
ll set_off(int n, int k){
return (n &= ~(1UL << k));
}
bool check_bit(int n, int k){
int bit = (n >> k) & 1U;
if(bit == 1)
return true;
return false;
}
ll dp[18][11][11][2][2];
vi get_digits(ll n) {
vi v;
do {
v.push_back(n % 10);
n /= 10;
} while (n > 0);
reverse(v.begin(), v.end());
return v;
}
ll f(int idx, int last, int blast, bool big, bool nonzero, vi& digits){
if(idx == (int)digits.size()){
return dp[idx][last][blast][big][nonzero] = 1;
}
if(dp[idx][last][blast][big][nonzero] != -1)
return dp[idx][last][blast][big][nonzero];
ll ans = 0;
int sega = digits[idx];
if(big)
sega = 9;
for(int d = 0; d <= sega; d++){
if(d == last || d == blast)
continue;
bool nxtSmall = true;
if(!big && d == sega){
nxtSmall = false;
}
bool nZero = nonzero | (d > 0);
int lst = last, curr = d;
if(d == 0 && !nonzero){
lst = 10;
curr = 10;
}
ans += f(idx + 1, curr, lst, nxtSmall, nZero, digits);
}
return dp[idx][last][blast][big][nonzero] = ans;
}
ll solve(ll n) {
if (n <= 10) {
return (n == -1 ? 0 : n + 1);
}
memset(dp, -1, sizeof dp);
auto digits = get_digits(n);
return f(0, 10, 10, false, false, digits);
}
int main(){
ll l, r;
cin>>l>>r;
cout<<solve(r) - solve(l-1)<<endl;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |