Rezolvare completă PbInfo #1697 Cod1

Ionel și Georgel sunt colegi de clasă și doresc să facă schimb de fișiere prin email. Fiecare dintre ei își arhivează fișierele cu câte o parolă. Fiecare copil își construiește parola pe baza unui șir format din N numere naturale.

Numerele din șir care se folosesc efectiv pentru construirea parolelor sunt doar cele divizibile cu numerele din mulțimea {2,3,4,5,6,7,8,9,10,11,12,13,14,15}. Copiii numără câte din valorile din șir sunt divizibile cu fiecare din aceste numere.

Parola folosită de Ionel se obține prin însumarea numărului de valori din șir care sunt divizibile cu numerele din mulțimea {2,3,4,5,6,7,8,9}. Parola folosită de Georgel se obține prin însumarea numărului de valori din șir care sunt divizibile cu numerele din mulțimea {10,11,12,13,14,15}.

Cerința

Scrieţi un program care citește șirul celor N numere și determină:

  1. câte numere din șir nu se vor folosi în construirea parolelor celor doi copii;
  2. parola construită de Ionel;
  3. parola construită de Georgel.

Date de intrare

Fișierul de intrare cod1.in conține pe prima linie un număr natural P. Pentru toate testele de intrare, numărul P poate avea doar valoarea 1, 2 sau 3. Pe a doua linie numărul natural N, iar pe a treia linie, N numere naturale separate prin câte un caracter #.

Date de ieșire

Dacă valoarea lui P este 1, se va rezolva numai punctul 1) din cerințe. În acest caz, fişierul de ieşire cod1.out va conţine pe prima linie un număr natural nenul reprezentând câte numere din șir nu s-au folosit la construirea parolelor sau 0 dacă nu există astfel de numere.

Dacă valoarea lui P este 2, se va rezolva numai punctul 2) din cerințe. În acest caz, fişierul de ieşire cod1.out va conţine pe prima linie un număr natural reprezentând parola construită de Ionel.

Dacă valoarea lui P este 3, se va rezolva numai punctul 3) din cerințe. În acest caz, fişierul de ieşire cod1.out va conţine pe prima linie un număr natural reprezentând parola construită de Georgel.

Restricții și precizări

  • 0 < N ≤ 100 000
  • 2 ≤ numărul de cifre ale unui număr ≤ 100
  • Se garantează că toate parolele pe care copiii le vor obține sunt nenule
  • În fișierul de intrare ultimul număr nu este urmat de caracterul #
  • 16% din teste conțin doar numere formate din cel mult 9 cifre
  • Pentru rezolvarea corectă a cerinţei 1 se obțin 20 de puncte, pentru rezolvarea corectă a cerinţei 2 se obțin 40 de puncte iar pentru rezolvarea corectă a cerinţei 3 se obțin 40 de puncte

Exemplul 1

cod1.in

1
6
10#20#12#34#15#23

cod1.out

1

Explicație

Doar numărul 23 nu este divizibil cu niciun număr din mulțimea {2,3,…15}

Exemplul 2

cod1.in

2
5
16#61#12#385#31

cod1.out

9

Explicație

Pentru parola lui Ionel trebuie sa verificăm divizibilitatea cu numerele 2,3,4,5,6,7,8,9. Două numere sunt divizibile cu 2 (16 și 12), un număr este divizibil cu 3 (12), două numere sunt divizibile cu 4 (16 și 12), un număr este divizibil cu 5 (385), un număr este divizibil cu 6 (12), un număr este divizibil 7 (385), un număr este divizibil cu 8 (16). Parola este 2+1+2+1+1+1+1=9

Exemplul 3

cod1.in

3
5
30#1100#11#85#121

cod1.out

6

Explicație

Pentru parola lui Georgel trebuie sa verificăm divizibilitatea cu numerele 10, 11, 12, 13, 14, 15.
Două numere sunt divizibile cu 10 (30 și 1100), trei numere sunt divizibile cu 11 (1100, 11 și 121), și un număr este divizibil cu 15 (30). Parola este 2+3+1=6

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 Cod1:

#include <stdio.h>
#include<stdlib.h>
FILE *in,*out;
long cate=0;
long N,M,i,j;char c; int P,n,nr;
long v[300],gr_i[20],gr_g[20],g[20];

int selectie(long v[300],long m,long g[16])
{ int i;long s=0;
for(i=0;i<=19;i++) g[i]=0;
//grupa 2,3,4,5,6,7,8,9,10,11,12,13,14,15
v[0]=0;
//2
if(v[m]%2==0) g[2]++;

//3
s=0;
for(i=1;i<=m;i++) s+=v[i];
if(s%3==0)g[3]++;

//4
if((v[m-1]*10+v[m])%4==0)g[4]++;

//5
if(v[m]%5==0)g[5]++;

//6
if(g[2]&&g[3]) g[6]++;

//7
int s1=0,s2=0,s3=0;
for(i=m;i>5;i=i-6)
{
    s1=v[i-2]*100+v[i-1]*10+v[i];
    s2=v[i-5]*100+v[i-4]*10+v[i-3];
    s3+=s1-s2;
}
if(i==5)
{
    s1=v[i-2]*100+v[i-1]*10+v[i];
    s2=v[i-4]*10+v[i-3];
    s3+=s1-s2;
}
if(i==4)
{
    s1=v[i-2]*100+v[i-1]*10+v[i];
    s2=v[i-3];
    s3+=s1-s2;
}
if(i==3) s3+=v[i-2]*100+v[i-1]*10+v[i];
if(i==2) s3+=v[i-1]*10+v[i];
if(i==1) s3+=v[i];
if(s3<0) s3=-s3;
if(s3%7==0)g[7]++;

//8
if(m>=3&&(v[m-2]*100+v[m-1]*10+v[m])%8==0)g[8]++;
if(m==2&&(v[m-1]*10+v[m])%8==0)g[8]++;
if(m==1&&(v[m])%8==0)g[8]++;

//9
if(s%9==0)g[9]++;

//10
if(v[m]==0)g[10]++;

//11
s1=0, s2=0;
for(i=1;i<=m;i++)
    if(i%2) s1+=v[i]; else s2+=v[i];
if(s1>s2) s=s1-s2;else s=s2-s1;
if(s%11==0)g[11]++;

//12
if(g[4]&&g[3])g[12]++;

//13
if(s3%13==0)g[13]++;

//14
if(g[2]&&g[7])g[14]++;

//15
if(g[3]&&g[5])g[15]++;
return 0;
}

int main()
{
    long nrc=0;
    freopen("cod1.in","r",stdin);
    freopen("cod1.out","w",stdout);
    scanf("%d\n%ld\n", &P, &N);
    for(i=0;i<=15;i++){gr_i[i]=0;gr_g[i]=0;}

    for(i=1;i<=N;i++)
    {   n=0;
        scanf("%c",&c);
        while(c!='#'&&c!='\n')
        {
            n++;
            v[n]=c-'0';
            if(v[n])nrc++;
            scanf("%c",&c);
        };
        selectie(v,n,g);
        long numar=0;
        for(j=2;j<=15;j++) numar+=g[j];
        if(numar==0) cate++;
        for(j=2;j<=9;j++) gr_i[j]+=g[j];
        for(j=10;j<=15;j++) gr_g[j]+=g[j];
    }

  long cod_i=0,cod_g=0;
  for(i=2;i<=9;i++)
   if(gr_i[i]!=0)cod_i+=gr_i[i];
  for(i=10;i<=15;i++)
   if(gr_g[i]!=0)cod_g+=gr_g[i];

  if(P==1)printf("%ld\n",cate);
  if(P==2)printf("%ld\n",cod_i);
  if(P==3)printf("%ld\n",cod_g);
    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 Adresa de email.

Rezolvarea problemei #1697 Cod1

Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #1697 Cod1 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!