Cod sursa(job #2593846)

Utilizator vladth11Vlad Haivas vladth11 Data 4 aprilie 2020 18:33:40
Problema Cifre Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.66 kb
#include <bits/stdc++.h>
#define debug(x) cerr << #x << " " << x << "\n"

using namespace std;
typedef long long ll;

ll dp[11][11][2],c,k;

ll digitdp(ll idx, ll aparitie, ll one ,ll flag, string s) {
    ll rez = 0;
    if(idx == s.size()) {
        return (aparitie >= k);
    }
    if(dp[idx][aparitie][flag] != -1)
        return dp[idx][aparitie][flag];
    for(ll i = 0; i <= 9; i++) {

        ll cifra = s[idx] - '0';
        if(cifra < i && flag)
            break;
        int cv = one;
        if(i)
            cv = 1;
        if(i < cifra) {
            rez += digitdp(idx + 1, aparitie + (i == c && (c != 0 || one)), cv, 0, s);
        } else {
            rez += digitdp(idx + 1, aparitie + (i == c && (c != 0 || one)), cv, flag, s);
        }
    }
    return rez;
}

ll diferenta(string str1, string str2) {
    ll a = 0,b = 0;
    for(int i = 0;i < str1.size();i++)
        a = a * 10 + (str1[i] - '0');
    for(int i = 0;i < str2.size();i++)
        b = b * 10 + (str2[i] - '0');

    return (b - a);
}

int main() {

    ifstream cin("cifre.in");
    ofstream cout("cifre.out");
    string a,b;
    memset(dp, -1, sizeof(dp));
    cin >> a >> b >> c >> k;
    ll reza = 0, rezb = 0;
    if(a == "0") {
        if(c == 0 && k <= 1)
            reza--;
    } else {
        ll n = a.size() - 1;
        a[n]--;
        while(a[n] < '0') {
            a[n] = '9';
            n--;
            a[n]--;
        }
    }
    reza += digitdp(0,0,0,1LL,a);
    memset(dp, -1, sizeof(dp));
    rezb = digitdp(0,0,0,1LL,b);
    cout <<fixed << setprecision(4) <<(double)(rezb - reza) / (double)diferenta(a,b);
    return 0;
}