Cod sursa(job #2190666)

Utilizator mjmilan11Mujdar Milan mjmilan11 Data 31 martie 2018 14:29:33
Problema Diviz Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.95 kb
#include <iostream>
#include <fstream>

using namespace std;

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

const int MOD = 30103;

int dp[3][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]] << ' ';
        }
        /*for(int j=0;j<=9;j++)
        {
            fout << prc[i][j] << ' ';
        }
        fout << '\n';*/
    }
    for(int i=1;i<=9;i++)
    {
        dp[1][prc[0][i]][i%k]=1;
    }
    int sol=0;
    for(int len=1;len<=b;len++)
    {
        for(int i=len;i<=n;i++)
        {
            for(int r=0;r<k;r++)
            {
                dp[(len+1)%2][i][r]=0;
            }
        }
        for(int i=len;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%2][i][r];
                        x+=dp[(len+1)%2][prc[i][cif]][(r*10+cif)%k];
                        x%=MOD;
                        dp[(len+1)%2][prc[i][cif]][(r*10+cif)%k]=x;
                    }
                }
               // fout << dp[len][i][r] << ' ';
            }
            //fout << '\n';
            if(len>=a)
            {
                sol+=dp[len%2][i][0];
                sol%=MOD;
            }
        }
       // fout << '\n';
    }
    fout << sol;
    return 0;
}