Cerința
Se dă un şir format din n
numere naturale nenule. Să se afle numărul secvenţelor din şir care au produsul elementelor egal cu 2
k
, unde k
este un număr natural dat.
Date de intrare
Fișierul de intrare memory006.in
conține pe prima linie numerele n
şi k
, iar pe a doua linie n
numere naturale nenule, separate prin spații.
Date de ieșire
Fișierul de ieșire memory006.out
va conține pe prima linie numărul S
, reprezentând numărul secvenţelor din şir care au produsul elementelor egal cu 2
k
.
Restricții și precizări
1 ≤ n ≤ 500.000
1 ≤ k ≤ 10.000
- numerele de pe a doua linie a fișierului de intrare vor fi mai mari decât
1
şi mai mici decât10
18
Exemplu
memory006.in
5 3 7 4 2 4 5
memory006.out
2
Explicație
Avem n=5,k=3
. În şirul dat există două secvenţe care au produsul elementelor egal cu 2
3
, şi anume 4,2
şi 2,4
.
Cum e corect?
cout < "As la info";
cout << "As la info";
cout >> "As la info";
Felicitări! Poți mai mult?
Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.
Greșit, dar nu-i bai!
Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.
Rezolvare
Iată rezolvarea de 100 de puncte pentru problema Memory006:
#include <fstream>
using namespace std;
ifstream f("memory006.in");
ofstream g("memory006.out");
long long n,k,i,suma,nr,x,st,dr,p[60];
long mij;
char a[10001],t,j;
char exp(long le , long ri)
{
if ( le > ri ) return 0 ;
mij = ( le + ri ) / 2 ;
if ( x == p[mij] ) return mij ;
if ( x < p[mij] ) return exp(le,mij-1);
else return exp(mij+1,ri);
}
int main()
{
f >> n >> k ;
p[1] = 2 ;
for ( i=2 ; i<= 57 ; i++ ) p[i] = p[i-1] * 2 ;
nr = 0 ;
suma = 0 ;
st = 0 ;
dr = -1 ;
for ( i=0 ; i<n ; i++ )
{
f >> x ;
t = exp(1,57) ;
if ( t==0 )
{
suma = 0 ;
st = 0 ;
dr = -1 ;
}
else
{
dr = ( dr + 1 ) % 10001 ;
a[dr] = t ;
suma = suma + t ;
if ( suma>=k )
{
if ( suma==k ) nr++ ;
else
{
while ( suma>k )
{
suma = suma - a[st] ;
st = ( st + 1 ) % 10001 ;
}
if ( suma==k ) nr++ ;
}
}
}
}
g << nr ;
return 0;
}
Atenție
Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa .
Rezolvarea problemei #1839 Memory006
Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #1839 Memory006 de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.
Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!