Cod sursa(job #2194472)

Utilizator FunnyStockyMihnea Andreescu FunnyStocky Data 13 aprilie 2018 16:00:05
Problema Cifre Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.88 kb
#include <iostream>
#include <algorithm>
#include <fstream>

using namespace std;

ifstream fin("cifre.in");
ofstream fout("cifre.out");

int st,dr;
int c,k;

int fact(int x)
{
    int ans=1,i;
    for(i=1;i<=x;i++)
        ans*=i;
    return ans;
}
int comb(int a,int b)
{
    return fact(a)/(fact(b)*fact(a-b));
}
int expow(int a,int b)
{
    int ans=1;
    while(b>0)
    {
        if(b%2==1)
            ans*=a;
        a*=a;
        b/=2;
    }
    return ans;
}

int fu(int a,int b)
{
    return comb(a,b)*expow(9,a-b);
}

int f(int a,int b,int cnt) /// a pozitii, b nr, am pus deja cnt
{
    if(cnt>b || b-cnt>a)
        return 0;
    return fu(a,b-cnt);
}

int cif[15];
int slove(int x)
{
    int l=0,aux=x;
    while(aux>0)
    {
        cif[++l]=aux%10;
        aux/=10;
    }
    reverse(cif+1,cif+l+1);
    int ans=0;
    for(int i=1;i<l;i++)
    {
        int adun=0;
        for(int j=k;j<=l;j++)
            adun+=f(i-1,j,1);
        for(int j=k;j<=l;j++)
            adun+=8*f(i-1,j,0);
        ans+=adun;
    }
    int cnt=0;
    for(int p=0;p<l;p++)
    {
        if(cif[p]==c)
            cnt++;
        int cate=0,adun=0;
        if(p==0)
            cate=cif[p+1]-1;
        else
            cate=cif[p+1];
        if(cate==0)
            continue;
        if(cif[p+1]>c)
        {
            for(int j=k;j<=l;j++)
                adun+=f(l-p-1,j,cnt+1);
            cate--;
        }
        if(cate==0)
            continue;
        for(int j=k;j<=l;j++)
            adun+=cate*f(l-p-1,j,cnt);
        ans+=adun;
    }
    int cate=0;
    for(int j=1;j<=l;j++)
        if(cif[j]==c)
            cate++;
    if(cate>=k)
        ans++;
    return ans;
}


int main()
{
    fin>>st>>dr;
    fin>>c>>k;
    int nr=slove(dr)-slove(st-1),l=dr-st+1;
    fout<<(double)nr/l;
    return 0;
}
/**
**/