Hello, I'm trying to solve this OJ URI problem. But I'm having difficulty counting the number of times 0 was used to form the numbers in the interval [A, B]. The other digits I got. can anybody help me?
#include <bits/stdc++.h>
using namespace std;
#define all(x) x.begin(), x.end()
#define sz(x) (int) x.size()
#define pb push_back
#define fst first
#define snd second
typedef long long int ll;
typedef unsigned long long int ull;
typedef vector <int> vi;
typedef pair <int, int> ii;
typedef pair <int, ii> iii;
typedef pair <int, iii> iiii;
typedef pair <int, string> is;
ll dp[20][100][2];
string s;
ll solve(int id, int sum, int prefix, int base)
{
if(id == sz(s))
return sum;
if(dp[id][sum][prefix] != -1)
return dp[id][sum][prefix];
ll ans = 0;
for(int i = 0; i <= 9; i++)
{
if(prefix)
{
if(i > s[id] - '0')
continue;
ans += solve(id + 1, sum + (i == base ? 1 : 0), !(i < s[id] - '0'), base);
}
else
ans += solve(id + 1, sum + (i == base ? 1 : 0), 0, base);
}
return dp[id][sum][prefix] = ans;
}
ll solve2(int id, int sum, int prefix, int zeroleft)
{
if(id == sz(s))
return sum;
if(dp[id][sum][prefix] != -1)
return dp[id][sum][prefix];
ll ans = 0;
int i = (id == 0);
for(; i <= 9; i++)
{
if(prefix)
{
if(i > s[id] - '0')
continue;
ans += solve2(id + 1, sum + (i == 0 and zeroleft == 0), !(i < s[id] - '0'), zeroleft == false ? false : (i != 0 ? false : true));
}
else
ans += solve2(id + 1, sum + (i == 0 and zeroleft == 0), 0, zeroleft == false ? false : (i != 0 ? false : true));
}
return dp[id][sum][prefix] = ans;
}
ll solve(string x, int y)
{
memset(dp, -1, sizeof dp);
s = x;
if(y == 0)
return solve2(0, 0, true, false);
return solve(0, 0, true, y);
}
int main()
{
int x, y;
while(scanf("%d %d", &x, &y), x or y)
{
string mx = to_string(y), mn = to_string(x - 1);
for(int i = 0; i <= 9; i++)
printf("%lld%s", solve(mx, i) - solve(mn, i), i == 9 ? "\n" : " ");
}
return 0;
}







