Cod sursa(job #2606962)

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

using namespace std;

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

int k,a,b,lung;
long long 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[OK][i][j];
        }
      }
    }
   if(lungime>=a)
   for(int i=1;i<=lung;i++)
    sol+=mat[OK][i][0];
   OK=1-OK;
  }
g<<sol;
}