Pagini recente » Cod sursa (job #1951923) | Cod sursa (job #2779195) | Cod sursa (job #2346011) | Cod sursa (job #2053210) | Cod sursa (job #1615439)
#include <iostream>
#include <fstream>
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],stt[15][15][15];
void Solve(int n,int val,int nrk)
{ int i,j,k,t,sol=0;
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];
//cout<<i<<" "<<j<<" "<<nrk<<" ="<<st[i][j][nrk]<<"\n";
}
// cout<<sol<<"\n";
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];
// cout<<i<<" "<<j<<" "<<nrk<<" ="<<st[i][j][nrk]<<"\n";
}
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);
// cout<<res;
if (n1>0) res-=Ans(n1-1,val,nrk-1);
res=n2-n1+1-res;
// cout<<Ans(n1-1,val,nrk-1);
g<<(double) res/(n2-n1+1);
return 0;
}