Cod sursa(job #1465578)

Utilizator killer301Ioan Andrei Nicolae killer301 Data 27 iulie 2015 17:22:56
Problema Cifre Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.99 kb
#include <cstdio>

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 sum = 0;
	if(nrc >= k)sum = 1;
	for(int i=n-1; i>=0; i--)
	{
		///formula : sum += a[i]*d[i][>=k] + (a[i]-1>=c ? d[i-1][>=k-1] : 0)
		for(int j=k; j<=i; j++)
			sum += a[i]*d[i][j];
		if(a[i]-1 >= c)
			for(int j=k-1; j<=i-1; j++)
				sum += d[i-1][j];
		if(a[i] == c)k--;
	}
	return sum;
}

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);
	if(c == 0)d[0][1] = 1;
	else 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("%lf", 1.0*ans/(b-a+1));
    return 0;
}