Pagini recente » Cod sursa (job #583584) | Cod sursa (job #2103053) | Cod sursa (job #135375) | Cod sursa (job #74938) | Cod sursa (job #2593844)
#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;
}
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,0,1LL,a);
memset(dp, -1, sizeof(dp));
rezb = digitdp(0,0,0,1LL,b);
cout <<(double)(rezb - reza) / (double)diferenta(a,b);
return 0;
}