Cod sursa(job #917695)

Utilizator apopeid13Apopeid Alejandro apopeid13 Data 18 martie 2013 11:34:33
Problema Diviz Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.13 kb
#include <cstring>
#include <fstream>
using namespace std;
const int Mod = 30103;
const int Kmax = 102;
const int Nmax = 202;
int K, A, B;
char N[Nmax];
int D[2][Nmax][Kmax];
int Sol, L[10];
ifstream F("diviz.in");
ofstream G("diviz.out");
int main()
{
F >> K >> A >> B >> N;
int M = strlen(N);
for (int i = 1,act = 0; i <= M; ++i, act=!act)
{
memset(D[act], 0, sizeof(D[act]));
for (int j=1;j <= M; ++j) 
{
if (i == 1 && N[j - 1] - '0' != 0) 
D[act][j][(N[j - 1] - '0') % K] = 1;
for (int k = 0; k < K; ++k) 
{
D[act][j][(k * 10 + N[j - 1] - '0') % K] += D[!act][j - 1][k];
if (D[act][j][(k * 10 + N[j - 1] - '0') % K] >= Mod)
D[act][j][(k * 10 + N[j - 1] - '0') % K] -= Mod;
}
}
for (int k = 0; k < K; ++k)
{
memset(L, 0, sizeof(L));
for (int j = 1; j <= M; ++j)
{ 
D[act][j][k] -= L[N[j - 1] - '0'];
L[N[j - 1] - '0'] = D[act][j][k] + L[N[j - 1] - '0'];
D[act][j][k] += D[act][j - 1][k];
while (D[act][j][k] >= Mod) D[act][j][k] -= Mod;
while (D[act][j][k] < 0) D[act][j][k] += Mod;
}
}
if (i >= A && i <= B)
{
Sol += D[act][M][0];
if (Sol >= Mod) Sol -= Mod;
}
}
G << Sol << '\n';
}
return 0;
}