Cod sursa(job #3230015)

Utilizator bent_larsenSturzu Antonio-Gabriel bent_larsen Data 18 mai 2024 19:09:55
Problema Cifre Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.27 kb
#include <bits/stdc++.h>
using namespace std;

int comp(int nr, int count, int dig)
{
	vector<int> v;
	while(nr)
	{
		v.push_back(nr % 10);
		nr /= 10;
	}
	reverse(v.begin(), v.end());
	int n = v.size();
	const int lim = 15;
	int dp[n + 1][15][2];
	memset(dp, 0, sizeof(dp));
	dp[0][0][1] = 1;
	for(int i = 1;i <= n;++i)
	{
		for(int j = 0;j < lim;++j)
		{
			//Don't use digit
			dp[i][j][0] = 9 * dp[i - 1][j][0];
			//Use digit
			if(j)
				dp[i][j][0] += dp[i - 1][j - 1][0];
			int sub = 0;
			if(dig < v[i - 1])
				sub = 1;
			dp[i][j][0] += (v[i - 1] - sub) * dp[i - 1][j][1];
			if(sub && j)
				dp[i][j][0] += dp[i - 1][j - 1][1];
			if(dig == v[i - 1])
			{
				if(j)
					dp[i][j][1] = dp[i - 1][j - 1][1];
			}
			else
				dp[i][j][1] = dp[i - 1][j][1];
		}
	}
	int ans = 0;
	for(int i = count;i < lim;++i)
		ans += dp[n][i][0] + dp[n][i][1];
	return ans;
}


int main() {
	freopen("cifre.in", "r", stdin);
	freopen("cifre.out", "w", stdout);
	int a, b, c, k;
	cin >> a >> b >> c >> k;
	
	if(!a)
	{
		int ret = comp(b, k, c);
		cout << fixed << setprecision(5) << (double) ret / (b - a + 1);
	}
	else
	{
		int ret = comp(b, k, c) - comp(a - 1, k, c);
		cout << fixed << setprecision(5) << (double) ret / (b - a + 1);
	}
}