#include<iostream>
#include<cstdlib>
#include <algorithm>
using namespace std;
#define TEST_DATA false
#define PRINT_DEBUG_INFO false
#define PRINT_RESULT true
int Newton( int n, int k)
{
int Wynik = 1;
for( int i = 1; i <= k; i++)
{
Wynik = Wynik * ( n - i + 1 ) / i;
}
return Wynik;
}
int main()
{
int d, n, all;
d = n = all = 0;
int dwu_New = 0;
#if TEST_DATA == true
d = 7;
n = 3;
int tab[3] = {1, 2, 5};
int tab_all[5];
all = 5;
for (int i=0; i<=all; i++)
{
if ( i == 0)
tab_all[i] = 0;
else if (i == (all - 1))
tab_all[all-1] = d;
else if ( i != 0 && i != (all - 1))
tab_all[i] = tab[i-1];
}
#else
cin >> d;
cin >> n; //d - dlugosc miarki ; n - ilosc podzialek
int *tab = new int [n]; // tabela ktora przetrzymuje wprowadzone wskazniki
all = n + 2;
int *tab_all = new int [all]; //tabela ktora przetrzymywac bedzie wszystkie podzialki z 0 i koncem
for (int i=0; i<n; i++) //tutaj sa zapisane wartosci tych podzialek
{
cin >> tab[i];
}
for (int i=0; i<all; i++)
{
if ( i == 0)
tab_all[i] = 0;
else if (i == (all - 1))
tab_all[all-1] = d;
else if (i != 0 && i != (all - 1))
tab_all[i] = tab[i-1];
} // 59-67 zapisane do tab_all wyszskich podzialek wlocznie z 0 i koncem
#endif
dwu_New = Newton( n + 2 , 2); // policzenie ilosci komibnacji dwuelementowych
int *tab_scale = new int [dwu_New]; // stowrzenie tablice na te kombinacje
//tablica która zawieta wszytkie podziałki to [tab_all] rozmiar 5 (test)
int k = 0;
for (int j=all-1; j>0; j--)
{
for (int i=0; i<j; i++)
{
tab_scale[k] = tab_all[j] - tab_all[i];
k++;
}
}
#if PRINT_DEBUG_INFO == true
cout << endl << "dwumian Newtona: " << dwu_New << endl;
cout << endl << "Tablica wszystkich podzialek: " << dwu_New << endl;
for (int i=0; i<all; i++)
{
cout << tab_all[i] << ", ";
}
//ta tablica wyswietla wysztkie mozliwe do uzyskania wyniki, nie uwzglednia 0
cout << endl << "*****tablica z wszystkimi różnicami: " << endl;
for (int i=0; i<dwu_New; i++)
{
cout << tab_scale[i] << ", ";
}
#endif
sort(tab_scale, tab_scale+dwu_New); //funkcja sortujaca
#if PRINT_DEBUG_INFO == true
cout << endl << "*****tablica z wszystkimi różnicami posegregowana: " << endl;
for (int i=0; i<dwu_New; i++)
{
cout << tab_scale[i] << ", ";
}
#endif
int *niepowtarzalne = new int [dwu_New];
int l = 0;
for (int i=0; i<dwu_New; i++)
{
if (tab_scale[i] != tab_scale[i+1])
{
niepowtarzalne [l] = tab_scale[i];
l++;
}
}
#if PRINT_DEBUG_INFO == true
cout << endl << "*****tablica z różnicami posegregowana bez duplikatow: " << endl;
for (int i=0; i<l; i++)
{
cout << niepowtarzalne[i] << ", ";
}
#endif
int *miarki = new int [l]; // tu sprawdzam czy sa wszyskie miarki
for (int i=0; i<l+1; i++)
{
miarki[i] = niepowtarzalne[i+1] - niepowtarzalne[i];
}
#if PRINT_DEBUG_INFO == true
cout << endl << "Czy sa wszystkie miarki " << endl;
for (int i=0; i<l-1; i++)
{
cout << miarki[i] << ", ";
}
cout << endl;
for (int i=0; i<l-1; i++)
{
if (i == l-2 && miarki[l-2] == 1)
{
cout << endl << "Mozna wyznaczyc wszystkie mierki. Tak. " << endl;
}
else if (miarki[i] != 1)
{
cout << endl << "Nie mozna zmierzyc wszystkich miarek. Nie." << endl;
break;
}
}
#endif
#if PRINT_RESULT == true
for (int i=0; i<l-1; i++)
{
if (i == l-2 && miarki[l-2] == 1)
{
cout << endl << "Tak" << endl;
}
else if (miarki[i] != 1)
{
cout << endl << "Nie" << endl;
break;
}
}
#endif
delete [] tab;
delete [] tab_scale;
delete [] tab_all;
delete [] niepowtarzalne;
delete [] miarki;
return 0;
}