Pagini recente » Cod sursa (job #3181840) | Cod sursa (job #1113158) | Cod sursa (job #2875396) | Cod sursa (job #129672) | Cod sursa (job #529831)
Cod sursa(job #529831)
// 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 ();
long long 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;
}