Cod sursa(job #1209378)

Utilizator SebiSebiPirtoaca George Sebastian SebiSebi Data 17 iulie 2014 15:55:35
Problema Cifre Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
#include<iostream>
#include<fstream>
#include<string.h>
#include<algorithm>
using namespace std;

#define NMAX 15

int d[NMAX][NMAX][2],v[NMAX];

int dp(int x, int C, int k)
{
	int n,i,j,nr;
	memset(d,0,sizeof(d));
	n=0;
	while(x) {
		v[++n]=x%10;
		x=x/10;
	}
	for(i=1;i<=n/2;i++)
		swap(v[i],v[n-i+1]);
	if(C<=v[n]) {
		d[n][1][0]=d[n][1][1]=1;
		d[n][0][0]=v[n];
		d[n][0][1]=9;
	}
	else {
		d[n][1][1]=1;
		d[n][0][0]=C;
		d[n][0][1]=9;
	}
	d[n][0][0]=v[n];
	for(i=n-1;i>=1;i--) {
		if(C<v[i]) 
			d[i][0][0]=(v[i]-1)*d[i+1][0][1]+d[i+1][0][0];
		else if(C==v[i])
			d[i][0][0]=v[i]*d[i+1][0][1];
		else d[i][0][0]=v[i]*d[i+1][0][1]+d[i+1][0][0];
		d[i][0][1]=9*d[i+1][0][1];
		for(j=1;j<=n-i+1;j++) {
			if(C<v[i]) 
				d[i][j][0]=d[i+1][j-1][1]+(v[i]-1)*d[i+1][j][1]+d[i+1][j][0];
			else if(C==v[i]) 
				d[i][j][0]=d[i+1][j-1][0]+v[i]*d[i+1][j][1];
			else d[i][j][0]=v[i]*d[i+1][j][1]+d[i+1][j][0];
			d[i][j][1]=d[i+1][j-1][1]+9*d[i+1][j][1];
		}
	}
	nr=0;
	if(C) {
		for(j=k;j<=10;j++)
			for(i=1;i<=n;i++)
				nr=nr+d[i][j][0]-d[i+1][j][0];
	}
	else {
		for(j=k;j<=n-1;j++)
			for(i=1;i<=n-1;i++)
				nr=nr+d[i][j][0]-d[i+1][0][1];
		nr++;
	}
	return nr;
}

int main ()
{
	int a,b,c,k,nr;
	ifstream f("cifre.in");
	ofstream g("cifre.out");
	f>>a>>b>>c>>k;
	f.close();
	//cout<<dp(99,0,1);
	nr=dp(b,c,k);
	if(a>=2)
		nr=nr-dp(a-1,c,k);
	g<<(double)nr/(b-a+1);
	g.close();
	return 0;
}