Cod sursa(job #1497749)

Utilizator MrTudorTudor Savulescu MrTudor Data 7 octombrie 2015 11:28:00
Problema Diviz Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.75 kb
#include <fstream>
#include <cstring>
#define MOD 30103

using namespace std;

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

int k, A, B;
int v[210], lenght;
int D1[210][110], D2[210][110], D3[210][110][10];

char N[210];

void citire(){

    fin >> k >> A >> B;
    fin >> (N + 1);

    lenght = strlen(N + 1);

    for(int i = 1; i <= lenght; i ++)
    {
        v[i] = N[i] - '0';
    }

}

void solve(){

    D1[0][0] = 1;
    D2[0][0] = 1;

    for(int i = 1; i <= lenght; i ++)
    {
        for(int j = 1; j <= i; j ++)
        {
            for(int mod = 0; mod < k; mod ++)
            {
                if(v[i] == 0 && j == 1)
                {
                    continue;
                }

                D2[j][mod] -= D3[j][mod][ v[i] ];

                if(D2[j][mod] < 0)
                {
                    D2[j][mod] += MOD;
                }

                D3[j][mod][ v[i] ] = 0;
            }
        }

        for(int j = 1; j <= i; j ++)
        {
            if(v[i] == 0 && j == 1)
            {
                continue;
            }
            for(int mod = 0; mod < k; mod ++)
            {
            D2[j][(mod * 10 + v[i]) % k] = (D2[j][(mod * 10 + v[i]) % k] + D1[j - 1][mod]) % MOD;
            //D2[j][(mod * 10 + v[i]) % k] %= MOD;
            D3[j][(mod * 10 + v[i]) % k][ v[i] ] += D1[j - 1][mod];
            D3[j][(mod * 10 + v[i]) % k][ v[i] ] %= MOD;
            }
        }

        memcpy(D1, D2, sizeof(D1));
    }


}
void afisare(){

    int x = 0;

    for(int i = A; i <= B; i ++)
    {
        x = (D1[i][0] + x) % MOD;
    }

    fout << x << '\n';
}
int main()
{

    citire();
    solve();
    afisare();

    return 0;
}