Cod sursa(job #785037)

Utilizator danalex97Dan H Alexandru danalex97 Data 7 septembrie 2012 17:34:59
Problema Diviz Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 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';
}