Pagini recente » Cod sursa (job #1275173) | Cod sursa (job #2133088) | Cod sursa (job #2852424) | Cod sursa (job #573576) | Cod sursa (job #1209378)
#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;
}