Cod sursa(job #1020641)

Utilizator narcis_vsGemene Narcis - Gabriel narcis_vs Data 2 noiembrie 2013 13:56:29
Problema Diviz Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.8 kb
#include <fstream>
#include <cstring>

#define In "diviz.in"
#define Out "diviz.out"
#define Mod 30103
#define Nmax 205
#define Kmax 105

using namespace std ;
int First[Nmax][10],dp[Nmax][Kmax][Nmax];
///dp[i][j][k] = numarul de subsiruri de lungime k terminate pe pozitia i care au restul j
int a[Nmax], K, y, x ,n ,sol;
char s[Nmax];
inline void Read()
{
    ifstream f(In);
    f>>K>>x>>y>>(s+1);
    for(n = 1;s[n];++n)
        a[n] = s[n]-'0';
    --n;
    f.close();
}

inline void PreProcess()
{
    int i;
    int Last[10];
    for(i = 0;i < 10;++i)
        Last[i] = n+1;
    for(i = n; i; --i)
    {
        Last[a[i]] = i;
        memcpy(First[i],Last,sizeof(Last));
    }
}

inline void Solve()
{
    int i, j, p ,c, k, r;
    for(c = 1;c < 10; ++c)
        if(First[1][c] <= n)
            dp[First[1][c]][c%K][1]++;
    for(k = 1;k <= y; ++k)
    {
        for(i = 1;i <= n; ++i)
            for(j = 0;j < K; ++j)
            {
                if(!dp[i][j][k])
                    continue;
                if(x <= k && j==0)
                {
                    sol += dp[i][j][k];
                    if(sol >= Mod)
                        sol -= Mod;
                }
                for(c = 0;c < 10; ++c)
                {
                    p = First[i+1][c];
                    if(p<=n)
                    {
                        r = (j*10+c)%K;
                        dp[p][r][k+1] += dp[i][j][k];
                        if(dp[p][r][k+1] >= Mod)
                            dp[p][r][k+1] -= Mod;
                    }
                }
            }
    }
}

inline void Write()
{
    ofstream g(Out);
    g<<sol<<"\n";
    g.close();
}

int main()
{
    Read();
    PreProcess();
    Solve();
    Write();
    return 0;
}