Pagini recente » Cod sursa (job #2783818) | Cod sursa (job #1034972) | Cod sursa (job #720872)
Cod sursa(job #720872)
#include <fstream>
#include <iomanip>
#define CMax 12
#define LL long long
using namespace std;
const int N=10;
int C, K;
LL DP[CMax][CMax][CMax];
void Initialize ()
{
for (int c=0; c<10; ++c)
{
if (c==C) DP[1][1][c]=1;
else DP[1][0][c]=1;
}
for (int c=1; c<10; ++c)
{
DP[1][0][c]+=DP[1][0][c-1];
DP[1][1][c]+=DP[1][1][c-1];
}
}
void SolveDP ()
{
Initialize ();
for (int i=2; i<N; ++i)
{
for (int k=0; k<=i; ++k)
{
for (int c=0; c<10; ++c)
{
if (c>0) DP[i][k][c]=DP[i][k][c-1];
if (c==C)
{
if (k>0) DP[i][k][c]+=DP[i-1][k-1][9];
}
else DP[i][k][c]+=DP[i-1][k][9];
}
}
}
for (int i=1; i<N; ++i)
{
for (int k=i-1; k>=0; --k)
{
for (int c=0; c<10; ++c)
{
DP[i][k][c]+=DP[i][k+1][c];
}
}
}
}
inline LL Query (LL X)
{
int Digits[CMax];
Digits[0]=Digits[1]=0;
if (X==0) Digits[0]=1;
for (; X>0; Digits[++Digits[0]]=X%10, X/=10);
LL S=DP[Digits[0]][K][9];
for (int i=Digits[0], k=K; i>0; --i)
{
S-=(DP[i][k][9]-DP[i][k][Digits[i]]);
if (Digits[i]==C) --k;
if (k<0) k=0;
}
return S;
}
int main()
{
ifstream fin ("cifre.in");
ofstream fout ("cifre.out");
LL A, B;
fin >> A >> B >> C >> K;
SolveDP ();
fout << fixed << setprecision (4) << 1.0*(Query (B)-Query (A-1))/(B-A+1) << "\n";
return 0;
}