Cod sursa(job #2211063)

Utilizator giotoPopescu Ioan gioto Data 9 iunie 2018 12:12:38
Problema Cifre Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.67 kb
#include <bits/stdc++.h>
using namespace std;

int a, b, c, k;
inline int lgput(int x, int p){
    int ans = 1, aux = x;
    for(int i = 0; (1 << i) <= p ; ++i){
        if((1 << i) & p) ans *= aux;
        aux *= aux;
    }
    return ans;
}
inline int comb(int n, int k){
    int ans = 1;
    for(int i = 2; i <= n ; ++i)
        ans *= n;
    for(int i = 2; i <= k ; ++i)
        ans /= i;
    for(int i = 2; i <= n - k ; ++i)
        ans /= i;
    return ans;
}
inline int solve(int x, int c, int k){
    int nrc = 0, aux = x, a[11];
    while(aux > 0) a[++nrc] = aux % 10, aux /= 10;

    if(x == 0 && c == 0 && k == 1) return 1;
    if(k > nrc) return 0;

    int ans = 0;
    for(int i = k; i < nrc ; ++i){
        int aux = comb(i - 1, k - 1);
        ans = ans + aux * lgput(10, i - k);
        if(i > k){
            aux = comb(i, k);
            ans = ans + aux * 9 * lgput(10, i - k - 1);
        }
    }

    for(int i = 1; i <= nrc / 2 ; ++i)
        swap(a[i], a[nrc - i + 1]);

    for(int i = 1; i <= nrc ; ++i){
        int cr = nrc - i;
        for(int j = (i == 1); j < a[i] ; ++j){
            int k2 = k - (j == c);
            if(k2 < 0) ++k2;
            if(k2 > cr) continue ;
            int aux = comb(cr, k2);
            ans = ans + aux * lgput(10, cr - k2);
        }
        if(a[i] == c && k > 0) --k;
    }
    if(k == 0) ++ans;
    return ans;
}
int main()
{
    freopen("cifre.in", "r", stdin);
    freopen("cifre.out", "w", stdout);
    scanf("%d%d%d%d", &a, &b, &c, &k);
    int nr = solve(b, c, k) - solve(a - 1, c, k);
    double sol = (double)nr / (double)(b - a + 1);
    printf("%f", sol);
    return 0;
}