Informatică, întrebare adresată de Utilizator anonim, 9 ani în urmă

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 2k, 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 2k.

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ât 1018

Răspunsuri la întrebare

Răspuns de ap53
11
#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 s,long d)
{
    if(s>d) return 0;
    mij=(s+d)/2;
    if(x==p[mij])
        return mij;
    if(x<p[mij])
        return exp(s,mij-1);
    else
        return exp(mij+1,d);
}

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;
}

express: Problema merge perfect...merci Ap53... daca as putea ti-as oferi eu 100p ...pentru ca sursa asta le merita pe deplin.
ap53: Cu ce-l compilezi?
ap53: Cu Borlandc?
ap53: Daca il compilezi cu BorlandC, atunci inlocuieste primele doua linii din sursa cu #include <fstream.h>
ap53: Sau scrie-mi aici ce eroare iti da la compilare.
ap53: Express, cred ca baiatul nu stie ce modificari sa faca daca el foloseste alt compilator.
ap53: Pai datele de intrare le citeste din fisierul memory006.in. Adauga fisierele memory006.in si memory006.out la proiect, iar in fisierul memory006.in trebuie sa pui datele de intrare (in forma ceruta) si sa salvezi (Ctrl+S). Daca nu te pricepi, roaga un coleg care stie sa te initieze.
Alte întrebări interesante