Pagini recente » Cod sursa (job #2427861) | Cod sursa (job #2673651) | Cod sursa (job #571118) | Cod sursa (job #2300558) | Cod sursa (job #1726857)
#include <fstream>
#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;
ifstream fin("cifre.in");
ofstream fout("cifre.out");
const int MAXCIF = 11;
int a[MAXCIF], b[MAXCIF];
int comb[MAXCIF][MAXCIF];
int C, K;
int rez;
void Read();
int Solve( int a[MAXCIF] );
int Variante( int l, int cn );
int main()
{
int i, j;
Read();
comb[0][0] = 1;
comb[1][0] = comb[1][1] = 1;
for ( i = 2; i < MAXCIF; i++ )
{
comb[i][0] = 1;
for ( j = 1; j <= i; j++ )
comb[i][j] = comb[i - 1][j] + comb[i - 1][j - 1];
}
j = 0;
for ( i = 1; i <= a[0]; i++ )
if ( a[i] == C ) j++;
if ( j >= K ) rez++;
rez += Solve(b);
rez -= Solve(a);
fout << rez << '\n';
fin.close();
fout.close();
return 0;
}
void Read()
{
char x;
while ( fin.get(x) && x >= '0' && x <= '9' )
a[++a[0]] = x - '0';
while ( fin.get(x) && x >= '0' && x <= '9' )
b[++b[0]] = x - '0';
fin >> C >> K;
}
int Solve( int a[MAXCIF] )
{
int i, j, cif = 0;
int res = 0;
// if ( a[0] == 1 )
// fout << "DA";
if ( C != 0 )
res = Variante(a[0] - 1, K);
else
{
for ( i = a[0] - 2; i >= 1; i-- )
res = res + 9*Variante(i, K);
if ( K == 0 )
res++;
}
for ( i = 1; i < a[0]; i++ )
{
for ( j = 1; j < a[i]; j++ )
{
if ( j == C ) res += Variante(a[0] - i, K - cif - 1);
else res += Variante(a[0] - i, K - cif);
}
if ( a[i] == C ) cif++;
}
if ( cif >= K ) res += ( a[i] + 1 );
else
if ( cif == K - 1 && a[i] >= C )
res++;
return res;
}
int Variante( int l, int cn )
{
int i, ret = 0;
if ( l == 0 )
return 0;
if ( cn == 0 )
return pow(10, l);
for ( i = cn; i <= l; i++ )
ret = ret + ( pow(9, l - i) * comb[l][i] );
return ret;
}