Pagini recente » Cod sursa (job #104912) | Cod sursa (job #2238233) | Cod sursa (job #1484983) | Cod sursa (job #1614948) | Cod sursa (job #2593846)
#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;
}