Cod sursa(job #2190657)

Utilizator mjmilan11Mujdar Milan mjmilan11 Data 31 martie 2018 14:08:28
Problema Diviz Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream fin("diviz.in");
ofstream fout("diviz.out");

const int MOD = 30103;

short dp[205][205][105],prc[205][10];

int main()
{
    ///dp[len][i][r] = numarul de numere distincte de lungime len
    ///care se termina pe pozitia i in n si au restul r prin impartirea la k
    ///solutia dp[a->b][1->n][0];
    int k,a,b;
    fin >> k >> a >> b;
    string x;
    fin >> x;
    int n=x.size();
    x="#"+x; /// indexare de la 1;
    for(int i=0;i<n;i++)
    {
        for(int j=i+1;j<=n;j++) /// prc[i][j]=prima cifra de j din dreapta pozitiei i;
        {
            if(prc[i][x[j]-'0']==0)
                prc[i][x[j]-'0']=j;
            //fout << prc[i][x[j]] << ' ';
        }
        //fout << '\n';
    }
    dp[0][0][0]=1;
    int sol=0;
    for(int len=0;len<=b;len++)
    {
        for(int i=0;i<=n;i++)
        {
            for(int r=0;r<k;r++)
            {
                for(int cif=0;cif<=9;cif++)
                {
                    if(prc[i][cif]!=0)
                    {
                        int x=0;
                        x+=dp[len][i][r];
                        x+=dp[len+1][prc[i][cif]][(r*10+cif)%k];
                        x%=MOD;
                        dp[len+1][prc[i][cif]][(r*10+cif)%k]=x;
                    }
                }
            }
            if(len>=a)
            {
                sol+=dp[len][i][0];
                sol%=MOD;
            }

        }
    }
    fout << sol;
    return 0;
}