diegorang's blog

By diegorang, history, 9 years ago, In English

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;
}

Full text and comments »

  • Vote: I like it
  • -9
  • Vote: I do not like it