Pagini recente » Cod sursa (job #3005460) | Cod sursa (job #433989) | Cod sursa (job #160310) | Borderou de evaluare (job #838049) | Cod sursa (job #523794)
Cod sursa(job #523794)
// 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;
}