# PBinfo #3670 – Afin1 – Rezolvare C++

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

## Enunț

Cifrul Afin este un cifru unde fiecare literă este înlocuită cu o altă literă printr-o operație matematica. Fiecărei litere i se asociază un cod: a-0 , b-1 , c-2 , … z-25 . De asemenea, mai avem două numere a și b, numite chei. Fiecare literă se înlocuiește cu litera care are codul egal cu (a*x+b) mod 26 , unde x este codul literei. Pentru anumite perechi de numere a și b rezultatul expresiei (a*x+b) mod 26 poate fi același pentru valori diferite ale lui x; p pereche a b cu această proprietate se consideră ineficientă.

Cerinta
Dându-se valoarea celor două chei și un mesaj criptat să se afișeze mesajul decriptat. Dacă a și b formează o pereche ineficientă atunci se afișează mesajul -1.

Date de intrare
Fișierul de intrare afin1.in conține pe prima linie numerele a b iar pe a doua linie mesajul criptat.

Date de ieșire
Fișierul de ieșire afin1.out va conține pe prima linie mesajul decriptat sau numarul -1 daca a si b formeaza o pereche ineficienta.

Restricții și precizări

1 ≤ lungimea mesajului ≤ 10000

Exemplul 1:
afin1.in

17 20
fekhfmbabfkkh
afin1.out

twentyfifteen
Exemplul 2;
afin1.in

14 19
jvphxbxnzrtrldjplnzffdtvhbvhbnrzxpjrpnzlltfthbvdf
afin1.out

-1

## Cod sursă C++

```cpp
#include <fstream>
using namespace std;
int codif[130];
int main()
{
    ifstream cin("afin1.in");
    ofstream cout("afin1.out");
    int a,b,ok=0;
    cin>>a>>b;
    for(char c='a';c<='z';c++)
    {
        if(codif[codif[(a*(c-'a')+b)%26+'a']]!=0)
            ok=-1;
        codif[(a*(c-'a')+b)%26+'a']=c;
    }
    char ch;
    cin.get(ch);
    if(ok==-1)
        cout<<-1;
    else
    {
        while(cin.get(ch) && ch!='\n')
            cout<<(char)(codif[ch]);
    }
    return 0;
}
```

## Resurse

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