Cod sursa(job #2321354)

Utilizator triscacezarTrisca Vicol Cezar triscacezar Data 15 ianuarie 2019 23:35:19
Problema Cifre Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <bits/stdc++.h>

using namespace std;

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

int a,b,c,k,i,j,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)
{
    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)
            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;
    }
    int x=fun(cnt,k);
    cnt=0;
    while(b)
    {
        A[++cnt]=b%10;
        b/=10;
    }
    int y=fun(cnt,k);
    g<<(double)(y-x)/(double)(aub-aua);
    return 0;
}