Cod sursa(job #2593833)

Utilizator vladth11Vlad Haivas vladth11 Data 4 aprilie 2020 18:11:58
Problema Cifre Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.46 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 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;
        if(i < cifra) {
            rez += digitdp(idx + 1, aparitie + (i == c), 0, s);
        } else {
            rez += digitdp(idx + 1, aparitie + (i == c), flag, s);
        }
    }
    return rez;
}
bool isSmaller(string str1, string str2)
{
    int n1 = str1.length(), n2 = str2.length();

    if (n1 < n2)
    return true;
    if (n2 < n1)
    return false;

    for (int i=0; i<n1; i++)
    if (str1[i] < str2[i])
        return true;
    else if (str1[i] > str2[i])
        return false;

    return false;
}
ll diferenta(string str1, string str2) {
    if (isSmaller(str1, str2))
        swap(str1, str2);

    string str = "";
    ll n1 = str1.length(), n2 = str2.length();

    ll carry = 0;
    for (ll i=0; i<n2; i++) {


        ll sub = ((str1[i]-'0')-(str2[i]-'0')-carry);

        if (sub < 0) {
            sub = sub + 10;
            carry = 1;
        } else
            carry = 0;

        str.push_back(sub + '0');
    }

    for (ll i=n2; i<n1; i++) {
        ll sub = ((str1[i]-'0') - carry);

        if (sub < 0) {
            sub = sub + 10;
            carry = 1;
        } else
            carry = 0;

        str.push_back(sub + '0');
    }

    reverse(str.begin(), str.end());
    ll nr = 0;
    for(ll i = str.size() - 1;i >= 0;i--){
        nr = nr * 10 + (str[i] - '0');
    }
    return nr;
}

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,1LL,a);
    memset(dp, -1, sizeof(dp));
    rezb = digitdp(0,0,1LL,b);
    cout <<fixed << setprecision(4) <<(double)(rezb - reza) / (double)diferenta(a,b);
    return 0;
}