Informatică, întrebare adresată de Marcoromana, 8 ani în urmă

Cerința
Se dă o matrice cu m linii şi n coloane, având elementele numere naturale nenule. Aflaţi câte coloane ale matricei au produsul elementelor divizibil cu un număr dat p.

Date de intrare
Fișierul de intrare memory003.in conține pe prima linie numerele m, n şi p, iar pe următoarele m linii câte n numere naturale separate prin spații, reprezentând elementele matricei.

Date de ieșire
Fișierul de ieșire memory003.out va conține pe prima linie numărul de coloane ale matricei pentru care produsul elementelor este divizibil cu p.

Restricții și precizări
1 ≤ m ≤ 1.000
1 ≤ n ≤ 300
1 ≤ p ≤ 1.000.000.000
elementele matricei sunt mai mici sau egale cu 100

Exemplu
memory003.in

2 3 10
4 7 5
25 8 6
memory003.out

2
Explicație
Produsul elementelor pe coloane este 100, 56, respectiv 30. Avem astfel două coloane cu produsul elementelor divizibil cu 10.


pmarian98: mai incerc eu
Marcoromana: Care e numele tau pe pbinfo?
pmarian98: nu ti-l zic
pmarian98: sry
Marcoromana: nu-i problema
Marcoromana: sunt curios cum iti iese problema
Marcoromana: bafta!
pmarian98: stii ca se citesc m linii cu 1000 de elemente si n coloane cu 300 de elemente si p este de tip long long int
boiustef: Caught fatal signal 11, e rezultatul meu pe Data încărcării 30 August 2018, 13:53 la toate testele sii nici nu inteleg din ce parte s-o iau... dar si limita f.mica de memorie e rezervata... Limita memorie Total: 0.3 MB / Stivă 0 MB, .... poate vine timpul sa ma intorc la ea ... :)))
pmarian98: E DE 100%

Răspunsuri la întrebare

Răspuns de pmarian98
7

#include <bits/stdc++.h>

using namespace std;

ifstream fin("memory003.in");

ofstream fout("memory003.out");

int n,m,x[305][105],y,s;  // retinem in x pt fiecare coloana frecventa  

                         //factorilor primi din descompunerea elementelor pe coloana

long p,t[105];

int main()

{

   int i,j,d,pu;

   fin >> m >> n >> p;

   for( i=1; i<=m; i++)

       for( j=1; j<=n; j++){

           fin >> y;                    // descompunem fiecare element in factori primi atunci cand il citim

           pu=0;                        //si il retinem in matrice  

           while( y % 2 == 0)  

                 pu++,y/=2;

           x[j][2] += pu;

           d = 3;

           while( d * d <= y ){

           pu = 0;

           while( y % d == 0 )

                pu++,y/=d;

           x[j][d] += pu;

           d += 2;

           }

           if( y > 1 ) x[j][y] ++;

       }

   bool ok = true;

   pu=0;

   while( p % 2 == 0)

       pu++,p/=2;               //descompunem nr dat in factori primi si retinem frecventa factorilor in t

   t[2] += pu;                    

   d = 3;

   while( d * d <= p ){

       pu = 0;

       while( p % d == 0 )

           pu++,p/=d;

       if(pu){

           if(d<=100) t[d] += pu;

           else ok = false;

       }

       d += 2;

   }

   if( p > 1 ){                //!!!E necesar ca acel nr sa nu aiba factor prim in descompunere mai mare ca 100  

       if(p <= 100) t[p]++;    // Daca se intampla acest lucru e evident ca produsul coloanei nu se divide cu acesta  

       else ok = false;        

   }

   if(!ok) fout << 0;

   else{

   for( j=1; j<=n; j++){          

       bool o = true;

       for( i=2; i<=100; i++)

           if( t[i] > x[j][i])      //Factorii primi ai numarului trebuie sa fie mai mari sau egali decat cei ai produsului

              o = false;            //coloanei respective

       if(o) s++;     //variabila s reprezinta nr de coloane care au produsul elementelor divizibil cu p

   }

   fout << s;

   }

   return 0;

}



pmarian98: #include

using namespace std;
ifstream f("memory003.in");
ofstream g("memory003.out");
long m,n,p,i,j,k,bun,prim[30],exp[30],pp[101],nr[101],pr[101][10],e[101][10],x,col[301][101],sol;

int main()
{
f >> m >> n >> p ;
for ( i=2 ; i*i<=p ; i++ )
if ( p%i==0 )
{
k++ ;
prim[k]=i ;
exp[k]=0 ;
while ( p%i==0 )
{
exp[k]++ ;
p=p/i ;
}
}
if ( p!=1 )
{
k++ ;
prim[k]=p ;
exp[k]=1 ;
}
pmarian98: if ( prim[k]>100 ) g << 0 ;
else
{
for ( i=1 ; i<=k ; i++ ) pp[prim[i]]=exp[i] ;
for( i=2 ; i<=100 ; i++)
{
x = i ;
nr[i]=0 ;
for( j=2 ; j*j <=x ; j++ )
if( x%j==0 )
{
pmarian98: {
nr[i]++ ;
pr[i][nr[i]]=j ;
while ( x%j==0 )
{
e[i][nr[i]]++ ;
x=x/j ;

}
}
if ( x!=1 )
{
nr[i]++ ;
pr[i][nr[i]]=x ;
e[i][nr[i]]=1 ;
}
}
for ( i=1 ; i<=m ; i++ )
for (j=1 ; j<=n ; j++ )
{
f >> x ;
if ( x!=1 )
{
for ( k=1 ; k<=nr[x] ; k++ ) col[j][pr[x][k]]+=e[x][k];
}
}
sol = 0 ;
for ( j=1 ; j<=n ; j++ )
{
bun=1 ;
for ( k=2 ; k<=97 ; k++)
if( col[j][k] sol+=bun ;
}
g << sol ;
}
return 0;
}
pmarian98: aceasta este idea lor
Marcoromana: poti sa imi faci un serviciu?
Marcoromana: imi poti trimite pe email cpp-ul?
pmarian98: adica?
pmarian98: il copiezi in office apoi il copiez din nou si il pui pe pbinfo
Marcoromana: ok
Marcoromana: Multumesc ptr ajutor!
Alte întrebări interesante