Cod sursa(job #2002810)

Utilizator victoreVictor Popa victore Data 20 iulie 2017 20:22:42
Problema Diviz Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include<cstdio>
#include<cstring>

using namespace std;

const int nmax=205;
const int mod=30103;

int v[nmax],d[2][nmax][105],pos[nmax][15];
char s[nmax];
bool este[15];

int main()
{
    freopen("diviz.in","r",stdin);
    freopen("diviz.out","w",stdout);
    int n,i,j,k,l,a,b;
    scanf("%d%d%d\n",&k,&a,&b);
    gets(s+1);
    n=strlen(s+1);
    for(i=1;i<=n;++i)
        v[i]=s[i]-'0';
    for(i=1;i<=n;++i)
        for(j=i+1;j<=n;++j)
            if(!pos[i][v[j]])
                pos[i][v[j]]=j;
    long long sol=0;
    for(i=1;i<=n;++i)
        if(!este[v[i]] && v[i])
        {
            este[v[i]]=1;
            d[1][i][v[i]%k]=1;
            if(a==1 && !(v[i]%k) )
                ++sol;
        }
    int nr,ind,rest;
    for(i=1;i<b;++i)
    {
        ind=(i+1)&1;
        memset(d[ind] , 0, sizeof(d[ind]));
        for(j=1;j<=n;++j)
            for(l=0;l<k;++l)
                for(nr=0;nr<10;++nr)
                    if(pos[j][nr])
                    {
                        rest=(10*l + nr) %k;
                        d[ind][pos[j][nr]][rest] += d[i&1][j][l];
                        if(d[ind][pos[j][nr]][rest]>=mod)
                            d[ind][pos[j][nr]][rest]-=mod;
                    }
        if(i+1>=a)
            for(j=1;j<=n;++j)
                sol+=d[ind][j][0];
        sol%=mod;
    }
    printf("%lld",sol);
}