Mai intai trebuie sa te autentifici.
Cod sursa(job #1090243)
Utilizator | Data | 22 ianuarie 2014 15:07:39 | |
---|---|---|---|
Problema | Diviz | Scor | 0 |
Compilator | cpp | Status | done |
Runda | concurs_2014 | Marime | 1.18 kb |
#include <cstdio>
#include <cstring>
#define Nmax 105
#define MOD 30103
using namespace std;
int K,A,B,N;
int DP[Nmax][Nmax][Nmax];
char s[Nmax];
void read()
{
scanf("%d%d%d\n%s",&K,&A,&B,s+1);
s[0] ='*';
N = strlen(s) - 1;
}
int F(int lung ,int ends ,int rest) /// lungime,unde se termina si au rest restul
{
if(DP[lung][ends][rest] != -1)
return DP[lung][ends][rest];
if(lung == 1)
{
DP[lung][ends][rest] = ((s[ends]-48) % K == 0 );
return DP[lung][ends][rest];
}
int val = 0;
for(int i = lung-1; i < ends; ++i)
val = (val + F(lung - 1 , i , ((rest - (s[ends]-48))/10 + K) % K ) ) % MOD;
DP[lung][ends][rest] = val;
return DP[lung][ends][rest];
}
int main()
{
freopen("diviz.in","r",stdin);
freopen("diviz.out","w",stdout);
for(int i = 0;i <= 101; ++i)
for(int j = 0 ; j <= 101; ++j)
for(int k = 0 ; k <= 101; ++k)
DP[i][j][k] = -1;
read();
int ans = 0;
for(int i = A; i <= B; ++i)
for(int j = i; j <= N; ++j)
ans = (ans + F(i,j,0)) % MOD;
printf("%d\n",ans);
return 0;
}