Cod sursa(job #1141379)

Utilizator barbuionBarbu Ion barbuion Data 12 martie 2014 20:41:04
Problema Diviz Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <fstream>
#include <string.h>
#define MOD 30103
using namespace std;
ifstream f("diviz.in");
ofstream g("diviz.out");
short int s[206];
short int cif[205][10],i,j,n,a1,b1,k,a[2][205][101],b[205][101],l,p,suma;
char ch;
int main()
{
    f>>k>>a1>>b1;
    while(f>>ch)
        s[++n]=ch-'0';
    for(i=n-1;i>=0;i--){
       for(int j=0;j<10;j++)
         cif[i][j]=cif[i+1][j];
        cif[i][s[i+1]]=i+1;
    }
    for(i=1;i<=9;i++)
       if(cif[0][i]!=0)
           a[1][cif[0][i]][i%k]++;
    for(l=2;l<=b1;l++){
      memset(a[l%2],0,sizeof(a[l%2]));
      // parcurgem matricea a
         for(i=l-1;i<n;i++){
            for(j=0;j<=k-1;j++)
               if(a[1-l%2][i][j]!=0){
                 //parcurgem linia i a lui cif
                 for(p=0;p<=9;p++)
                    if(cif[i][p]!=0){
                       a[l%2][cif[i][p]][(j*10+p)%k]=(a[l%2][cif[i][p]][(j*10+p)%k]+a[1-l%2][i][j]);
                      if( a[l%2][cif[i][p]][(j*10+p)%k]>=MOD)
                        a[l%2][cif[i][p]][(j*10+p)%k]-=MOD;
                    }
               }
         }
        if(l>=a1){
            for(i=l;i<=n;i++){
                suma=(suma+a[l%2][i][0]);
                if(suma>=MOD)
                    suma=suma-MOD;
            }
        }
      //  memcpy(a,b,sizeof(b));

    }
    g<<suma;
    return 0;
}