Cod sursa(job #756435)

Utilizator matei_cChristescu Matei matei_c Data 9 iunie 2012 17:06:45
Problema Diviz Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <cstdio>
#include <cstring>
const int MAX_N = 256 ;
const int MAX_K = 128 ;
const int MOD = 30103 ;

int n,k,a,b,cifra,sol ;
int nr[MAX_N];
char s[MAX_N];
int d[MAX_N][MAX_K][10];

void citire()
{
	
    scanf("%d %d %d\n",&k,&a,&b);
    scanf("%s\n",s);
	
    n = strlen(s);
    for(int i=0;i<n;++i)
        nr[i+1] = s[i] - '0';
	
}

void rezolvare()
{
	
    for(int pas=1;pas<=n;++pas)
    {
		
        cifra = nr[pas];
        for(int i=n-1;i>0;--i)
        {
            for(int j=0;j<k;++j)
                d[i+1][j][cifra] = 0;
            for(int j=0;j<k;++j)
            {
                int t = (j * 10 + cifra) % k;
                for(int c=0;c<=9;++c)
                {
                    d[i+1][t][cifra] += d[i][j][c];
                    if(d[i+1][t][cifra] >= MOD)
                        d[i+1][t][cifra] -= MOD;
                }
            }
        }
		
        if(cifra)
            d[1][cifra % k][cifra] = 1;
		
    }
	
    for(int i=a;i<=b;++i)
	{	
        for(int j=0;j<10;++j)
        {
            sol += d[i][0][j];
            if (sol >= MOD)
                sol -= MOD;
        }
	}
	
    printf("%d\n", sol);
	
}

int main()
{
	
    freopen("diviz.in","r",stdin);
    freopen("diviz.out","w",stdout);
	
    citire();
    rezolvare();
	
    return 0;
	
}