Cod sursa(job #2321416)

Utilizator triscacezarTrisca Vicol Cezar triscacezar Data 16 ianuarie 2019 01:17:21
Problema Cifre Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.47 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("cifre.in");
ofstream g("cifre.out");

int a,b,c,k,i,j,x,y,cnt,A[30],C[20][20];

int put(int b,int e)
{
    int ret=1;
    while(e)
    {
        if(e&1)
            ret*=b;
        e>>=1;b*=b;
    }
    return ret;
}

int Get(int cnt,int mi)
{
    if(cnt<mi)return 0;
    int ret=0;
    for(int i=mi;i<=cnt;i++)
        ret+=C[cnt][i]*put(9,cnt-i);
    return ret;
}

int fun(int i,int lft)
{
    int ret=0;
    if(!i)
    {
        if(lft<=0)
            return 1;
        return 0;
    }
    if(c>A[i])
        ret=fun(i-1,lft)+A[i]*Get(i-1,lft);
    else
        if(c==A[i])
            ret=fun(i-1,lft-1)+A[i]*Get(i-1,lft);
        else
            ret=fun(i-1,lft)+(A[i]-1)*Get(i-1,lft)+Get(i-1,lft-1);
    return ret;
}

int main()
{
    for(i=0;i<=10;i++)
        C[i][0]=1;
    for(i=1;i<=10;i++)
        for(j=1;j<=i;j++)
            C[i][j]=C[i-1][j]+C[i-1][j-1];
    f>>a>>b>>c>>k;
    a--;
    int aub=b,aua=a;
    while(a)
    {
        A[++cnt]=a%10;
        a/=10;
    }
    x+=fun(cnt,k);
    //g<<aua<<':'<<x<<' ';
    if(!c)
        x+=9*Get(cnt-2,k)-Get(cnt-1,k-1);
    cnt=0;
    while(b)
    {
        A[++cnt]=b%10;
        b/=10;
    }
    y+=fun(cnt,k);
    //g<<aub<<':'<<y<<'\n';
    if(!c)
        y+=9*Get(cnt-2,k)-Get(cnt-1,k-1);
    //g<<aua<<':'<<x<<' '<<aub<<':'<<y<<'\n';
    g<<(double)(y-x)/(double)(aub-aua);
    return 0;
}