Pagini recente » Cod sursa (job #2166521) | Cod sursa (job #1664681) | Cod sursa (job #2293601) | Cod sursa (job #1875067) | Cod sursa (job #1209393)
#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,l;
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(i=2;i<=n;i++)
v[i]=9;
for(j=k;j<=n;j++) {
for(i=1;i<=n-1;i++) {
for(l=1;l<=v[i]-1;l++) {
nr=nr+d[i+1][j][1];
}
nr=nr+d[i+1][j][0];
}
if(j==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();
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;
}