Se dă un şir cu n numere naturale nenule. Aflaţi câte secvenţe din şir au produsul mai mic decât un număr natural p dat.
Date de intrare
Fișierul de intrare produs2.in conține pe prima linie numerele n şi p, iar pe a doua linie n numere naturale nenule separate prin spații, reprezentând elementele şirului.
Date de ieșire
Fișierul de ieșire produs2.out va conține pe prima linie numărul S, reprezentând numărul secvenţelor din şir având produsul mai mic decât p.
Restricții și precizări
1 ≤ n ≤ 1.000.000
1 < p ≤ 2.000.000.000
numerele din şir vor fi mai mici decât 1.000
Exemplu
produs2.in
5 10
1 2 3 4 2
produs2.out
9
Explicație
Avem 9 secvenţe în şir cu produsul mai mic decât 10:
1 2 1,2 1,2,3 2,3 3 4 4,2 2
Răspunsuri la întrebare
Răspuns de
1
In timp ce citesti numerele cu un for tii minte intr-un vector produsul tuturor numerelor pana la momentul actual:
f>>x;
Prod[i]=Prod[i-1]*x;
Trebuie memorat Prod[0]=1; inainte
Dupa care cu doua for-uri imbricate: unul cu i de la 1 la n si al doilea cu j de la i+1 la n verifici practic produsul tuturor secventelor posibile astfel:
If(Prod[j]/Prod[i-1] < p)
f>>x;
Prod[i]=Prod[i-1]*x;
Trebuie memorat Prod[0]=1; inainte
Dupa care cu doua for-uri imbricate: unul cu i de la 1 la n si al doilea cu j de la i+1 la n verifici practic produsul tuturor secventelor posibile astfel:
If(Prod[j]/Prod[i-1] < p)
ionutg38:
In acest fel, produsul nu ajunge la valori imense
using namespace std;
ifstream f("produs2.in");
ofstream g("produs2.out");
long long a[1000001];
long long n,p,i,j,x,s,prod,st,dr,k;
int main()
{
f>>n>>p;
for(i=1;i<=n;++i) f>>a[i];
st=1; dr=0;
prod=1;
while(prod*a[dr+1]<=p && dr+1<=n)
{
++dr;
prod*=a[dr];
}
s+=(dr-st+1)*(dr-st+2)/2;
while(dr<=n && st<=n)
{
prod/=a[st];
st++;
while(prod*a[dr+1]<=p && dr+1<=n)
{
prod*=a[dr+1];
dr++;
s+=dr-st+1;
}
}
g<<s;
return 0;
}
Alte întrebări interesante
Matematică,
9 ani în urmă
Limba română,
9 ani în urmă
Limba română,
9 ani în urmă
Biologie,
9 ani în urmă