Pagini recente » Cod sursa (job #1669422) | Cod sursa (job #325286) | Cod sursa (job #538762) | Cod sursa (job #34891) | Cod sursa (job #1020641)
#include <fstream>
#include <cstring>
#define In "diviz.in"
#define Out "diviz.out"
#define Mod 30103
#define Nmax 205
#define Kmax 105
using namespace std ;
int First[Nmax][10],dp[Nmax][Kmax][Nmax];
///dp[i][j][k] = numarul de subsiruri de lungime k terminate pe pozitia i care au restul j
int a[Nmax], K, y, x ,n ,sol;
char s[Nmax];
inline void Read()
{
ifstream f(In);
f>>K>>x>>y>>(s+1);
for(n = 1;s[n];++n)
a[n] = s[n]-'0';
--n;
f.close();
}
inline void PreProcess()
{
int i;
int Last[10];
for(i = 0;i < 10;++i)
Last[i] = n+1;
for(i = n; i; --i)
{
Last[a[i]] = i;
memcpy(First[i],Last,sizeof(Last));
}
}
inline void Solve()
{
int i, j, p ,c, k, r;
for(c = 1;c < 10; ++c)
if(First[1][c] <= n)
dp[First[1][c]][c%K][1]++;
for(k = 1;k <= y; ++k)
{
for(i = 1;i <= n; ++i)
for(j = 0;j < K; ++j)
{
if(!dp[i][j][k])
continue;
if(x <= k && j==0)
{
sol += dp[i][j][k];
if(sol >= Mod)
sol -= Mod;
}
for(c = 0;c < 10; ++c)
{
p = First[i+1][c];
if(p<=n)
{
r = (j*10+c)%K;
dp[p][r][k+1] += dp[i][j][k];
if(dp[p][r][k+1] >= Mod)
dp[p][r][k+1] -= Mod;
}
}
}
}
}
inline void Write()
{
ofstream g(Out);
g<<sol<<"\n";
g.close();
}
int main()
{
Read();
PreProcess();
Solve();
Write();
return 0;
}