# PBinfo #4342 – pdif – Rezolvare C++

Sursa: Codul lui Andrei
Limbaj: C++
Autor rezolvare: deivid

## Enunț

Se consideră un șir format din n numere naturale. Asupra numerelor din șir se face următoarea prelucrare: fiecare valoare este înlocuită cu cifra sa de control. Cifra de control a unui număr se obține adunând cifrele numărului, apoi noul număr devine suma cifrelor sale, iar procedeul se reia până când numărul obținut devine o cifră, numită cifra de control. În noul șir se formează secvențe de numere situate pe poziții alăturate care au parități diferite, numite p-dif. Lungimea unei secvențe p-dif reprezintă numărul de elemente din care este compusă secvența.

Cerința
Cunoscând numerele naturale n reprezentând numărul de numere din șir și c reprezentând cerința (1 sau 2) și un șir de n numere naturale, se cere să se rezolve următoarele cerințe:
1. dacă c = 1, atunci se cere să se afișeze lungimea maximă a unei secvențe p-dif și numărul de secvențe p-dif de lungime maximă din șir.
2. dacă c = 2, atunci se cere să se afișeze valorile st și dr, reprezentând poziția de început, respectiv de sfârșit a primei secvențe p-dif de lungime maximă.

Date de intrare
Fișierul de intrare pdif.in conţine pe prima linie, despărțite prin câte un spațiu, numerele naturale n și c, cu semnificaţia din enunţ. A doua linie conține n numere naturale, despărțite prin câte un spațiu.

Date de ieșire
Dacă c = 1, atunci pe prima linie a fişierului pdif.out vor fi scrise două numere ce reprezintă lungimea maximă a unei secvențe p-dif și numărul de secvențe p-dif de lungime maximă.
Dacă c = 2, atunci fişierul pdif.out va conţine valorile st și dr, reprezentând poziția de început, respectiv de sfârșit a primei secvențe p-dif de lungime maximă.

Restricții și precizări

0 < n ≤ 100.000
0 ≤ orice valoare din șir ≤ 1.000.000.000
lungimea unei secvențe este mai mare sau egală cu 1, iar numerotarea valorilor în șir începe de la 1
10 puncte se acordă pentru exemplele din enunț.

Exemplul 1:
pdif.in

6 1
14 2 48 3 35 1024
pdif.out

3 2
Explicație
Cele 6 numere sunt înlocuite cu valorile: 5, 2, 3, 3, 8, 7. Lungimea celei mai lungi secvențe p-dif este 3; numărul de secvențele p-dif cu acestă lungime este 2, iar acestea sunt 5, 2, 3 și 3, 8, 7.

Exemplul 2:
pdif.in

10 2
14 8 3 25 151 24 21 1022 101 21
pdif.out

1 3
Explicație
Cele 10 numere sunt înlocuite cu valorile: 5, 8, 3, 7, 7, 6, 3, 5, 2, 3. Sunt 3 secvențe p-dif de lungime maximă 3, iar prima dintre ele este: 5, 8, 3 și cuprinde elementele situate între pozițiile 1 și 3.

## Cod sursă C++

```cpp
#include <fstream>
#define NM 1000002
using namespace std;
ifstream fin("pdif.in");
ofstream fout("pdif.out");
int cifra_control(int x)
{
    int s,c;
    while(x>9)
    {
        s=0;
        while(x>0)
        {
            c=x%10;
            x=x/10;
            s=s+c;
        }
        x=s;
    }
    return x;
}
bool v[NM];
int main()
{
    int n,c,i,x,cc,lgm,lgc,nr,stm,drm,stc;
    fin>>n>>c;
    for(i=1; i<=n; i++)
    {
        fin>>x;
        cc=cifra_control(x);
        v[i]=cc%2;
    }
    lgm=1;
    stm=drm=1;
    lgc=1;
    stc=1;
    for(i=2; i<=n; i++)
        if(v[i]+v[i-1]==1)
        {
            lgc++;
            if(lgc>lgm)
            {
                lgm=lgc;
                nr=1;
                stm=stc;
                drm=i;
            }
            else if(lgc==lgm)
                    {
                        nr++;
                    }
        }
        else
            {
                lgc=1;
                stc=i;
            }
    if(c==1)
        fout<<lgm<<' '<<nr<<endl;
    else
        fout<<stm<<' '<<drm<<endl;
    return 0;
}
```

## Resurse

- [Pagina originală](https://codulluiandrei.ro/rezolvari/pbinfo/4342)
- [Sursa C++](https://codulluiandrei.ro/rezolvari/pbinfo/4342/cod.cpp)
- [Sursa pe GitHub](https://raw.githubusercontent.com/codulluiandrei/pbinfo/main/pbinfo-4342/main.cpp)
- [Cursuri de informatică pentru BAC](https://codulluiandrei.ro/academia/info-curs/pachet-cpp/)
