Pagini recente » Cod sursa (job #835125) | Cod sursa (job #443131) | Cod sursa (job #1905340) | Cod sursa (job #842627) | Cod sursa (job #1615452)
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
ifstream f("cifre.in");
ofstream g("cifre.out");
int cif[15],dp[15][15][15],s[15][15][15],st[15][15][15];
void Solve(int n,int val,int nrk)
{ int i,j,k,t,sol=0;
memset(dp,0,sizeof(dp));
memset(s,0,sizeof(s));
memset(st,0,sizeof(st));
for(i=0;i<=9;i++)
{if (i!=val) dp[1][i][0]=1;
if (i==0) s[1][i][0]=dp[1][i][0];
else s[1][i][0]=s[1][i-1][0]+dp[1][i][0];
}
dp[1][val][1]=1;
if (val==0) s[1][0][1]=1;
for(i=1;i<=9;i++)
s[1][i][1]=dp[1][i][1]+s[1][i-1][1];
for(i=2;i<=n;i++)
{
for(j=0;j<=9;j++)
for(k=0;k<=nrk;k++)
{if (j!=val)
dp[i][j][k]+=s[i-1][9][k];
else
if (k>0)
dp[i][j][k]+=s[i-1][9][k-1];
if (j==0) s[i][j][k]=dp[i][j][k];
else s[i][j][k]=s[i][j-1][k]+dp[i][j][k];
}
}
for(i=1;i<=n;i++)
for(j=0;j<=9;j++)
{ st[i][j][0]=dp[i][j][0];
for(k=1;k<=nrk;k++)
st[i][j][k]=st[i][j][k-1]+dp[i][j][k];
}
}
int Ans(int x,int val,int nrk)
{ int i,j,nc=0,auxx=x,v[15],sol=0,startj;
while(x)
{ nc++; v[nc]=x%10;
x/=10;
}
Solve(nc,val,nrk);
if (auxx>0 && !(val==0 && nrk==0)) sol=1;
for(i=1;i<nc;i++)
for(j=1;j<=9;j++)
sol+=st[i][j][nrk];
for(i=nc;i>=1;i--)
{ if (i<nc) startj=0; else startj=1;
for(j=startj;j<v[i];j++)
sol+=st[i][j][nrk];
if (v[i]==val) nrk--;
if (nrk<0) break;
}
if (nrk>=0) sol++;
return sol;
}
int main()
{ int n1,n2,val,nrk,res;
f>>n1>>n2>>val>>nrk;
res=Ans(n2,val,nrk-1);
if (n1>0) res-=Ans(n1-1,val,nrk-1);
res=n2-n1+1-res;
g<<(double) res/(n2-n1+1);
return 0;
}