Cod sursa(job #734031)

Utilizator darrenRares Buhai darren Data 13 aprilie 2012 14:07:59
Problema Diviz Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <cstring>
#include <fstream>
#include <vector>

using namespace std;

const int MOD = 30103;

int K, A, B;
char N[202];
int P[2][202][102], result;
bool is[10], final[202];
int last[10], prev[202];

int main()
{
	ifstream fin("diviz.in");
	ofstream fout("diviz.out");
	
	fin >> K >> A >> B >> N;
	int M = strlen(N);
	
	for (int i = 1; i <= M; ++i)
	{
		if (last[N[i - 1] - '0']) prev[i] = last[N[i - 1] - '0'];
		last[N[i - 1] - '0'] = i;
	}
	
	int act = 0;
	for (int i = 1; i <= M; ++i) // cu i cifre
	{
		act = !act;
		memset(P[act], 0, sizeof(P[act]));
		for (int j = i; j <= M; ++j) // se termina pana in j
		{
			if (i == 1) P[act][j][(N[j - 1] - '0') % K] = 1;
			for (int k = 0; k < K; ++k) // cel dinainte avea restul k
			{
				P[act][j][(k * 10 + N[j - 1] - '0') % K] += P[!act][j - 1][k];
				if (P[act][j][(k * 10 + N[j - 1] - '0') % K] >= MOD) P[act][j][(k * 10 + N[j - 1] - '0') % K] -= MOD;
			}
		}
		for (int j = 1; j <= M; ++j)
			for (int k = 0; k < K; ++k)
			{
				P[act][j][k] += P[act][j - 1][k];
				if (prev[j]) P[act][j][k] -= P[act][prev[j]][k] - P[act][prev[j] - 1][k];
				while (P[act][j][k] >= MOD) P[act][j][k] -= MOD;
				while (P[act][j][k] < 0)    P[act][j][k] += MOD;
			}
		
		if (i >= A && i <= B)
		{
			result += P[act][M][0];
			if (result >= MOD) result -= MOD;
		}
	}
	
	fout << result << '\n';
	
	fin.close();
	fout.close();
}