Cod sursa(job #779174)

Utilizator vendettaSalajan Razvan vendetta Data 16 august 2012 22:16:40
Problema Diviz Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.07 kb
#include <iostream>
#include <fstream>

using namespace std;

#define nmax 205

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

int n, K, A, B, a[nmax], ap[11], viz[nmax][11], dp[nmax][nmax][101];
string s;

void citeste(){

   f >> K >> A >> B;
   f.get();
   getline(f,s);
   for(int i=0; i<s.size(); i++){
      a[i+1] = s[i] - '0';
   }
   n = s.size();

}

void rezolva(){

   //numarul de numere care sa fie divizibile cu K si care sa ai aiba intre A si B cifre;
   //metoda inainte
   //dp[i][j][r] = numarul de subsiruri de lungime j iar a[i] sa fie a j-a cifra din numar si numarul format sa aiba restul r

   int rez = 0;

   for(int i=1; i<=n; i++){
      //cout << "aici" << dp[3][3][0] << "\n";
      if (a[i] != 0 && viz[1][a[i]] == 0){//initializez dinamica; cand pun doar o cifra; asta sa nu fie 0 si sa nu o mai fi pus inainte ca si prima cifra
         dp[i][1][ a[i]%K ] = 1;
         viz[1][ a[i] ] = 1;
         //pun a 2 cifra
         int rst = a[i]% K;
         for(int i2=0; i2<10; i2++) ap[i2] = 0;
         for(int i2=i+1; i2<=n; i2++){
            if (ap[ a[i2] ] == 0){//daca nu am mai pus-o inainte la un pas i2 precedent
               ap[ a[i2] ] = 1;
               dp[i2][2][ (rst*10+a[i2])%K ] += dp[i][1][rst];
            }
         }
      }

      for(int j=2; j<=B; j++){
         if (viz[j][ a[i] ] == 0){
            for(int rest=0; rest<K; rest++){
               for(int i2=0; i2<10; i2++) ap[i2] = 0;
               for(int i2=i+1; i2<=n; i2++){//pun a[i2] a j+1-a cifra
                  if (ap[ a[i2] ] == 0){
                     ap[ a[i2] ] = 1;
                     dp[i2][j+1][(rest*10+a[i2])%K] += dp[i][j][rest];
                     //if (dp[i][j][rest] > 0) viz[j][ a[i] ] = 1;
                  }
               }
            }
         }
      }
      for(int j=A; j<=B; j++) rez += dp[i][j][0]
      ;//, cout << dp[i][j][0] << " ";
      //cout << "\n";
   }

   g << rez << "\n";

}

int main(){

   citeste();
   rezolva();

   f.close();
   g.close();

   return 0;

}