Cod sursa(job #984003)

Utilizator stefanzzzStefan Popa stefanzzz Data 13 august 2013 10:56:41
Problema Diviz Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <fstream>
#include <string.h>
#define NRM 30103
#define MAXN 205
#define MAXM 105
using namespace std;
ifstream f("diviz.in");
ofstream g("diviz.out");

int m,a,b,n,nxt[MAXN][15],x,pd[2][MAXN][MAXM],act,sol;
char s[MAXN];

int main(){
    int i,j,k,ii;
    f>>m>>a>>b;
    f.getline(s+1,MAXN,'\n');
    f.getline(s+1,MAXN,'\n');
    n=strlen(s+1);
    for(i=n;i>=1;i--){
        x=s[i]-'0';
        for(j=0;j<10;j++)
            nxt[i][j]=nxt[i+1][j];
        nxt[i][x]=i;}
    for(i=1;i<10;i++)
        if(nxt[1][i]){
            x=nxt[1][i];
            for(j=0;j<10;j++)
                if(nxt[x+1][j])
                    pd[1][nxt[x+1][j]][(i*10+j)%m]++;
            if(a==1&&i%m==0)
                sol++;}
    act=1;
    for(k=2;k<=b;k++){
        for(i=k-1;i<=n;i++){
            for(j=0;j<m;j++){
                if(k>=a){
                    sol+=pd[act][i][0];
                    while(sol>NRM)
                        sol-=NRM;}
                if(pd[act][i][j]){
                    pd[act][i][j]%=NRM;
                    for(ii=0;ii<10;ii++)
                        if(nxt[i+1][ii])
                            pd[1-act][nxt[i+1][ii]][(j*10+ii)%m]+=pd[act][i][j];
                    pd[act][i][j]=0;}}}
        act=1-act;}
    g<<sol<<'\n';
    f.close();
    g.close();
    return 0;}