Cod sursa(job #2606966)

Utilizator valentinchipuc123Valentin Chipuc valentinchipuc123 Data 28 aprilie 2020 22:39:17
Problema Diviz Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.13 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("diviz.in");
ofstream g("diviz.out");

const int MOD=30103;
int k,a,b,lung;
int mat[2][205][105],sol;
int nxt[11][205];
bool OK=1;
string s;

void init()
{
  for(int i=1;i<=200;i++)
   for(int j=0;j<=100;j++)
    mat[1-OK][i][j]=0;
}

void prec()
{
 for(int cif=0;cif<=9;cif++)
  {
   nxt[cif][lung+1]=lung+1;
   for(int i=lung;i>=0;i--)
     {
      nxt[cif][i]=nxt[cif][i+1];
      if(s[i+1]==cif+'0') nxt[cif][i]=i+1;
     }
  }

  for(int cif=1;cif<=9;cif++)
   if(nxt[cif][0]<lung+1) mat[1][nxt[cif][0]][cif%k]++;

}

int main()
{
f>>k>>a>>b;
f>>s;
lung=s.length();
s=" "+s;
prec();
for(int lungime=1;lungime<=b;lungime++)
  {
   init();
   for(int i=1;i<=lung;i++)
    {
     for(int j=0;j<k;j++)
      if(mat[OK][i][j])
      {
       for(int c=0;c<10;c++)
        if(nxt[c][i]<lung+1)
        {
         mat[1-OK][nxt[c][i]][(j*10+c)%k]=(mat[1-OK][nxt[c][i]][(j*10+c)%k]+mat[OK][i][j])%MOD;
        }
      }
    }
   if(lungime>=a)
   for(int i=1;i<=lung;i++)
    sol=(sol+mat[OK][i][0])%MOD;
   OK=1-OK;
  }
g<<sol;
}