Pagini recente » Cod sursa (job #3220499) | Cod sursa (job #1391826) | Cod sursa (job #2953255) | Cod sursa (job #1762996) | Cod sursa (job #2190666)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("diviz.in");
ofstream fout("diviz.out");
const int MOD = 30103;
int dp[3][205][105],prc[205][10];
int main()
{
///dp[len][i][r] = numarul de numere distincte de lungime len
///care se termina pe pozitia i in n si au restul r prin impartirea la k
///solutia dp[a->b][1->n][0];
int k,a,b;
fin >> k >> a >> b;
string x;
fin >> x;
int n=x.size();
x="#"+x; /// indexare de la 1;
for(int i=0;i<n;i++)
{
for(int j=i+1;j<=n;j++) /// prc[i][j]=prima cifra de j din dreapta pozitiei i;
{
if(prc[i][x[j]-'0']==0)
prc[i][x[j]-'0']=j;
//fout << prc[i][x[j]] << ' ';
}
/*for(int j=0;j<=9;j++)
{
fout << prc[i][j] << ' ';
}
fout << '\n';*/
}
for(int i=1;i<=9;i++)
{
dp[1][prc[0][i]][i%k]=1;
}
int sol=0;
for(int len=1;len<=b;len++)
{
for(int i=len;i<=n;i++)
{
for(int r=0;r<k;r++)
{
dp[(len+1)%2][i][r]=0;
}
}
for(int i=len;i<=n;i++)
{
for(int r=0;r<k;r++)
{
for(int cif=0;cif<=9;cif++)
{
if(prc[i][cif]!=0)
{
int x=0;
x+=dp[len%2][i][r];
x+=dp[(len+1)%2][prc[i][cif]][(r*10+cif)%k];
x%=MOD;
dp[(len+1)%2][prc[i][cif]][(r*10+cif)%k]=x;
}
}
// fout << dp[len][i][r] << ' ';
}
//fout << '\n';
if(len>=a)
{
sol+=dp[len%2][i][0];
sol%=MOD;
}
}
// fout << '\n';
}
fout << sol;
return 0;
}