Cod sursa(job #984004)

Utilizator stefanzzzStefan Popa stefanzzz Data 13 august 2013 11:02:16
Problema Diviz Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.68 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,restx10[15],rest;
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=0;i<10;i++)
        restx10[i]=(i*10)%m;
    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]){
                    rest=restx10[i]+j;
                    while(rest>=m)
                        rest-=m;
                    pd[1][nxt[x+1][j]][rest]++;}
            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]){
                    while(pd[act][i][j]>=NRM)
                        pd[act][i][j]-=NRM;
                    for(ii=0;ii<10;ii++)
                        if(nxt[i+1][ii]){
                            rest=restx10[j]+ii;
                            while(rest>=m)
                                rest-=m;
                            pd[1-act][nxt[i+1][ii]][rest]+=pd[act][i][j];}
                    pd[act][i][j]=0;}}}
        act=1-act;}
    g<<sol<<'\n';
    f.close();
    g.close();
    return 0;}