Cod sursa(job #1128915)

Utilizator cat_red20Vasile Ioana cat_red20 Data 27 februarie 2014 19:15:26
Problema Diviz Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.62 kb
#include<fstream>
#include<cstring>
#define MOD 30103
using namespace std;
ifstream fin("diviz.in");
ofstream fout("diviz.out");
int a,b,k,ap[202][10],nrc,n[202],d[2][202][102],sol;

void citire()
{
    char s[202];
    int l;
    fin>>k>>a>>b;
    fin>>s;
    l=strlen(s);
    for(int i=0;i<l;i++)
    {
        n[++nrc]=s[i]-'0';
    }
}

void aparitii()
{
    for(int i=nrc-1;i>=0;i--)
    {
        memcpy(ap[i],ap[i+1],sizeof(ap[i+1]));
        ap[i][n[i+1]]=i+1;
    }
}

void din()
{
    for(int i=1;i<=9;i++)
    {
        if(ap[0][i]!=0)
        {
            d[1][ap[0][i]][i%k]++;
        }
    }
    int x;
    for(int i=2;i<=b;i++)
    {
        memset(d[i&1],0,sizeof(d[i&1]));
        for(int j=i-1;j<=nrc;j++)
        {
            for(int t=0;t<=k-1;t++)
            {
                if(d[1-(i&1)][j][t]!=0)
                {
                    for(int p=0;p<=9;p++)
                    {
                        if(ap[j][p]!=0)
                        {
                            x=(t*10+p)%k;
                            d[i&1][ap[j][p]][x]+=d[1-(i&1)][j][t];
                            if(d[i&1][ap[j][p]][x]>MOD)
                            d[i&1][ap[j][p]][x]-=MOD;
                        }
                    }
                }
            }
        }
        if(i>=a)
        {
            for(int j=1;j<=nrc;j++)
            {
                sol=sol+d[i&1][j][0];
                if(sol>MOD)
                    sol-=MOD;
            }
        }
    }
}

int main()
{
    citire();
    aparitii();
    din();
    fout<<sol;
    return 0;
}