Pagini recente » Cod sursa (job #1525351) | Cod sursa (job #945825) | Cod sursa (job #1783527) | Cod sursa (job #2469366) | Cod sursa (job #1350278)
#include<fstream>
#include<cstring>
using namespace std;
typedef int64_t var;
ifstream fin("cifre.in");
ofstream fout("cifre.out");
char a[12], b[12];
var c, k;
var NR[12][12];
char *strrev(char *str)
{
char *p1, *p2;
if (! str || ! *str)
return str;
for (p1 = str, p2 = str + strlen(str) - 1; p2 > p1; ++p1, --p2)
{
*p1 ^= *p2;
*p2 ^= *p1;
*p1 ^= *p2;
}
return str;
}
var solve(char *num, var i, var nrc, var k) {
if(num[i] == 0) return 0;
if(k == 0) {
return (num[i]-'0') * NR[nrc-1][k] + solve(num, i+1, nrc-1, k);
}
if(c == num[i]-'0') {
return (num[i]-'0') * NR[nrc-1][k] + solve(num, i+1, nrc-1, k-1);
}
if(c > num[i]-'0') {
return (num[i]-'0') * NR[nrc-1][k] + solve(num, i+1, nrc-1, k);
}
return (num[i] -'0'- 1) * NR[nrc-1][k] + NR[nrc-1][k-1] + solve(num, i+1, nrc-1, k);
}
int main() {
fin>>a>>b>>c>>k;
var p = 10;
NR[0][0] = 1;
for(var i=1; i<=10; i++) {
NR[i][0] = p;
p *= 10;
}
NR[1][1] = 1;
for(var i=1; i<=10; i++) {
for(var j=1; j<=10; j++) {
NR[i][j] += 10*NR[i-1][j] + NR[i-1][j-1];
}
}
var t=0;
strrev(a);
while(a[t] == '0') {
a[t++] = '9';
}
a[t]--;
if(a[strlen(a) - 1] == '0') a[strlen(a) - 1] = 0;
strrev(a);
var an, bn;
fin.seekg(ios_base::beg);
fin>>an>>bn;
//fout<<a;
fout<<1.0 * (solve(b, 0, strlen(b), k) - solve(a, 0, strlen(a), k)) / (bn-an+1);
//fout<<solve(a, 0, strlen(a), k);
return 0;
}