Pagini recente » Cod sursa (job #432283) | Cod sursa (job #985093) | Cod sursa (job #456770) | Cod sursa (job #1398529) | Cod sursa (job #2040908)
#include <iostream>
#include <fstream>
#include <iomanip>
using namespace std;
int dp[12][12][12][2];
int v[12];
int A,B,K,C,i,j,k,ind,newind,newk,nr,idx;
long double t,T;
int calc(int x)
{
int ret=0;
nr=0;
while(x!=0)
{
v[++nr]=x%10;
x/=10;
}
for(i=1;i<=nr;i++)
for(j=0;j<10;j++)
for(k=0;k<=nr;k++)
for(ind=0;ind<2;ind++)
dp[i][j][k][ind]=0;
for(j=1;j<=v[nr];j++)
{
if(j==C) k=1;
else k=0;
if(j==v[nr]) ind=1;
else ind=0;
dp[nr][j][k][ind]=1;
}
for(i=1;i<nr;i++)
for(j=1;j<=9;j++)
{
if(j==C) k=1;
else k=0;
dp[i][j][k][0]=1;
}
for(i=nr;i>=2;i--)
for(j=0;j<10;j++)
for(k=0;k<=nr;k++)
for(ind=0;ind<2;ind++)
{
for(idx=0;idx<10;idx++)
{
if(idx==C) newk=k+1;
else newk=k;
if((idx<=v[i-1]&&ind==1)||ind==0)
{
if(idx==v[i-1]&&ind==1) newind=1;
else newind=0;
dp[i-1][idx][newk][newind]+=dp[i][j][k][ind];
}
}
}
for(i=0;i<9;i++)
for(k=K;k<=nr;k++)
ret+=dp[1][i][k][0]+dp[1][i][k][1];
if(nr>=0&&K==0&&C<=1)
ret++;
return ret;
}
int main()
{
ifstream f("cifre.in");
ofstream g("cifre.out");
f>>A>>B>>C>>K;
t=calc(B)-calc(A-1);
T=B-A+1;
g<<fixed<<setprecision(4)<<t/T;
return 0;
}