Cod sursa(job #523794)

Utilizator ucc_5Usurelu Catalin ucc_5 Data 19 ianuarie 2011 12:54:33
Problema Divk Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.1 kb
// k/(Si-Sj) daca si numai daca restul impartiri lui Si la k este egal cu restul impartirii lui Sj la k
#include <fstream>
#define nmax 500001
#define kmax 100001
using namespace std;

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

int n,k,a,b,v[nmax],m[kmax];

void read ()
{
  f>>n>>k>>a>>b;
  v[0]=0;
  for (int i=1; i<=n; i++)
  {
    f>>v[i];
    v[i]=(v[i-1]+v[i])%k;  //calculam direct v[i]=restul sumei elementelor pana la i
  }
  f.close ();
}

int main ()
{
  read ();
  int nr_secv=0;
  m[0]=1; //daca exista v[i] divizibil cu k inseamna ca se poate forma singura subsecventa (cel putin prima),
          // nu are nevoie de diferenta (v[j]-v[i-1]), pentru ca practic v[i-1]=0;
  for (int i=a; i<=n; i++)
  {
    nr_secv+=m[v[i]];
    m[v[i-a+1]]++;       // puteam calcula direct pentru i=1,a toate combinatiile de "resturi" 
    if (i>=b)            // dar cand trebuia sa scadem pentru i>=b era prea mult de calculat formula
      m[v[i-b]]--;       // daca i=b, putem scadea m[0] pentru ca deja a fost introdus in rezultat
  }
  g<<nr_secv;
  g.close (); return 0;
}