Cod sursa(job #2017619)

Utilizator NToniBoSSNicolae Tonitza NToniBoSS Data 1 septembrie 2017 21:57:58
Problema Cifre Scor 60
Compilator c Status done
Runda Arhiva de probleme Marime 2.77 kb
#include <stdio.h>
#include <stdlib.h>
long long d[11][11],nr,nra,nrb;
int v[11];
long long f(int n,int k,int c)
{
    int i,j,kc=k,ct;
    long long x=0,aux;
    for(i=1; i<=n && k; i++)
    {
        for(j=1; j<v[i]; j++)
            if(j==c)
                for(ct=1; ct<=n-i; ct++)
                    x+=d[ct][k-1];
            else
                for(ct=1; ct<=n-i; ct++)
                    x+=d[ct][k];
        if(i>1 && v[i]>0)
            if(c==0)
                for(ct=1; ct<=n-i; ct++)
                    x+=d[ct][k-1];
            else
                for(ct=1; ct<=n-i; ct++)
                    x+=d[ct][k];
        if(v[i]==c)
            k--;
        if(k==0)
            break;
    }
    aux=0;
    for(j=i+1; j<=n; j++)
        aux=aux*10+v[j];
    if(aux>0) aux++;
    x+=aux;
    for(i=1; i<n; i++)
        x+=d[i][kc];
    return x;
}
int main()
{
    int a,b,c,k,i,j,cp,cif,kc,dif;
    freopen("cifre.in","r",stdin);
    freopen("cifre.out","w",stdout);
    scanf("%d%d%d%d",&a,&b,&c,&kc);
    dif=b-a+1;
    d[1][0]=10;
    d[2][0]=90;
    d[3][0]=900;
    d[4][0]=9000;
    d[5][0]=90000;
    d[6][0]=900000;
    d[7][0]=9000000;
    d[8][0]=90000000;
    d[9][0]=900000000;
    d[10][0]=9000000000LL;
    d[1][1]=1;
    for(i=2; i<=10; i++)
        for(j=1; j<=i; j++)
            if(c==0)
            {
                nr=0;
                for(k=1; k<i; k++)
                    nr+=d[k][j];
                d[i][j]=9LL*nr;
            }
            else
            {
                nr=0;
                for(k=1; k<i; k++)
                    nr+=d[k][j];
                d[i][j]=8LL*nr;
                nr=0;
                nr=0;
                for(k=1; k<i; k++)
                    nr+=d[k][j-1];
                d[i][j]+=nr;
            }
    a--;
    if(a<=0)
        nra=0;
    else
    {
        cp=a;
        cif=0;
        while(cp)
        {
            cif++;
            cp/=10;
        }
        if(a>=c && a<10)
            nra=1;
        else
            nra=0;
        for(i=cif; i>0; i--)
        {
            v[i]=a%10;
            a/=10;
        }
        nra+=f(cif,kc,c);
        for(i=1; i<=cif; i++)
            v[i]=0;
    }
    if(b<=0)
        nrb=0;
    else
    {
        cp=b;
        cif=0;
        while(cp)
        {
            cif++;
            cp/=10;
        }
        if(b>=c && b<10)
            nrb=1;
        else
            nrb=0;
        for(i=cif; i>0; i--)
        {
            v[i]=b%10;
            b/=10;
        }
        nrb=f(cif,kc,c);
        for(i=1; i<=cif; i++)
            v[i]=0;
    }
    double z;
    int rez=nrb-nra;
    if(kc==0) rez=dif;
    z=(double)rez/dif;
    printf("%.6lf\n",z);

    return 0;
}