Cod sursa(job #1650253)

Utilizator SilviuIIon Silviu SilviuI Data 11 martie 2016 17:24:56
Problema Cifre Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.68 kb
#include <stdio.h>
#include <cstring>
#include <algorithm>

using namespace std;

int a,b,aa,bb,c,k,l,sol;
int t[20],v[20];
int dp[2][20][20];

int memo(int t[20],int n)
{
    memset(dp,0,sizeof(dp)); dp[1][0][0]=1;

    for (int i=1;i<=n;i++) {

        for (int j=0;j<n;j++) {

            for (int l=(i==1)? 1:0;l<=9;l++)
                if (l==c) {
                    dp[0][i][j+1]+=dp[0][i-1][j];
                    if (l<t[i]) dp[0][i][j+1]+=dp[1][i-1][j];
                    if (l==t[i]) dp[1][i][j+1]+=dp[1][i-1][j];
                } else {
                    dp[0][i][j]+=dp[0][i-1][j];
                    if (l<t[i]) dp[0][i][j]+=dp[1][i-1][j];
                    if (l==t[i]) dp[1][i][j]+=dp[1][i-1][j];
                }

        }

    }

    int sol=0;

    for (int i=k;i<=n;i++) sol=sol+dp[0][n][i]+dp[1][n][i];

    return sol;
}

int main()
{
    freopen("cifre.in","r",stdin);
    freopen("cifre.out","w",stdout);

    scanf("%d %d %d %d",&a,&b,&c,&k);

    int l=0; aa=a; bb=b;

    while (b>0) { l++; t[l]=b%10; b=b/10; }

    reverse(t+1,t+l+1);

    sol=sol+memo(t,l);

    if (c==0 && aa==0) sol=1;

    for (int i=1;i<l;i++) {

        for (int j=1;j<=i;j++) v[j]=9;

        sol=sol+memo(v,i);
    }

    if (aa<=1) { printf("%.5f",(1.*sol)/(bb-aa+1)); return 0; }

    l=0;

    while (a>0) { l++; t[l]=a%10; a=a/10; }

    reverse(t+1,t+l+1); int b=l;

    while (b>0 && t[b]==0) { t[b]=9; b--; }

    t[b]--;

    sol=sol-memo(t,l);

    for (int i=1;i<l;i++) {

        for (int j=1;j<=i;j++) v[j]=9;

        sol=sol-memo(v,i);
    }

    printf("%.5f",(1.*sol)/(bb-aa+1));

    return 0;
}