Cod sursa(job #2606627)

Utilizator robert.barbu27robert barbu robert.barbu27 Data 28 aprilie 2020 10:26:43
Problema Diviz Scor 100
Compilator cpp-64 Status done
Runda aflafafew Marime 1.64 kb
#include <iostream>
#include <bits/stdc++.h>
#define ull unsigned long long int
using namespace std;
ifstream f("diviz.in");
ofstream g("diviz.out");
const int mod=30103;
int main()
{
    int k,a,b,sol=0;
    f>>k>>a>>b;
    string n;
    f>>n;
    vector<vector<int> > dp1(n.size()+5,vector<int>(k+1,0));
    vector<vector<int> > dp2(n.size()+5,vector<int>(k+1,0));
    vector<vector<int> > aux(n.size()+5,vector<int>(k+1,0));
    vector<vector<int> > nxt(n.size()+5,vector<int>(10,-1));
    vector<int> last(10,-1);
    cout<<dp1[1][2];
    for(int i=n.size()-1;i>=0;i--)
    {
        for(int j=0;j<10;j++)
        {
            nxt[i][j]=last[j];
        }
        last[n[i]-'0']=i;
    }
    for(int j=1;j<=9;j++)
    {
        if(last[j]!=-1)
        {
            dp1[last[j]][j%k]=1;
        }
    }
    for(int i=1;i<=n.size();i++)
    {
        for(int j=i-1;j<n.size();j++)
        {
            if(i>=a&&i<=b)
            {
                sol+=dp1[j][0];
                sol=sol%mod;
            }
            for(int r=0;r<k;r++)
            {
                if(dp1[j][r]!=0)
                {
                    for(int d=0;d<=9;d++)
                    {
                        int poz=nxt[j][d];
                        if(poz!=-1)
                        {
                            int newrest=(r*10+d)%k;
                            dp2[poz][newrest]+=dp1[j][r];
                            dp2[poz][newrest]=dp2[poz][newrest]%mod;
                        }
                    }
                }
            }
        }
        dp1=dp2;
        dp2=aux;


    }
    g<<sol<<'\n';




}