Cod sursa(job #1466066)

Utilizator killer301Ioan Andrei Nicolae killer301 Data 28 iulie 2015 16:26:37
Problema Cifre Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.02 kb
#include <cstdio>
#include <algorithm>

using namespace std;

int d[15][15];
int a[15];
int c;

int sum_up(int nr, int k)
{
	int n = 0;
	do
	{
		a[n++] = nr%10;
		nr/=10;
	}
	while(nr);
	int nrc = 0;
	for(int i=0; i<n; i++)
		if(a[i] == c)
			nrc++;
	int ans = 0;
	for(int i=n-1; i>=0; i--)
	{
		int sum = 0, sum2 = 0;
		for(int j=max(0, k); j<=i; j++)
			sum += d[i][j];
		for(int j=max(0, k-1); j<=i; j++)
			sum2 += d[i][j];
		if(a[i]-1 >= c)ans = ans + (a[i]-1)*sum + sum2;
		else ans = ans + a[i]*sum;
		if(a[i] == c)k--;
	}
	if(nrc >= k)ans++;
	return ans;
}

int main()
{
    freopen("cifre.in", "r", stdin);
    freopen("cifre.out", "w", stdout);
    int a, b, k;
    scanf("%d%d%d%d", &a, &b, &c, &k);
	d[0][0] = 1;
	for(int i=1; i<10; i++)
		for(int j=0; j<=i; j++)
		{
			if(c)d[i][j] = 9 * d[i-1][j] + d[i-1][j-1];
			else d[i][j] = 9 * d[i-1][j] + d[i-1][j-1];
		}
	int ans = sum_up(b, k)-sum_up(a-1, k);
	//printf("%d", ans);
	printf("%lf", 1.0*ans/(b-a+1));
    return 0;
}