Niestety, nie byliśmy w stanie w pełni poprawnie wyświetlić tego pliku, ponieważ nie jest zakodowany w UTF-8. Możesz pobrać ten plik i spróbować otworzyć go samodzielnie.
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
#include <stdio.h>

long tab[300001], n, krotnosci[31], powtorzenia[10001], licz_powt=0;
long start,koniec,pom,odp[300001];


int SORT_tab(int pocz,int kon) //Przepisane z Cormena
{
int sx,sq,si,sj,pom;
if(pocz<kon)
    {
     sx = tab[kon];
     si=pocz-1;
     for(sj=pocz;sj<=kon-1;sj++)
        {
         if (tab[sj]<sx) 
            {
             si++;
             pom=tab[si]; tab[si]=tab[sj]; tab[sj]=pom;
            }
        }
     pom=tab[si+1]; tab[si+1]=tab[kon]; tab[kon]=pom;
     sq=si+1;
     SORT_tab(pocz,sq-1);
     SORT_tab(sq+1,kon);
    }
return 0;
}



/*int SORT_powtorzenia(int pocz,int kon) //Przepisane z Cormena
{
int sx,sq,si,sj,pom;
if(pocz<kon)
    {
     sx = powtorzenia[kon];
     si=pocz-1;
     for(sj=pocz;sj<=kon-1;sj++)
        {
         if (powtorzenia[sj]<sx) 
            {
             si++;
             pom=powtorzenia[si]; powtorzenia[si]=powtorzenia[sj]; powtorzenia[sj]=pom;
            }
        }
     pom=powtorzenia[si+1]; powtorzenia[si+1]=powtorzenia[kon]; powtorzenia[kon]=pom;
     sq=si+1;
     SORT_powtorzenia(pocz,sq-1);
     SORT_powtorzenia(sq+1,kon);
    }
return 0;
}
*/




int main()
{
scanf("%ld",&n);
for (int ii=1; ii<=n; ii++)   scanf("%ld",&tab[ii]);

SORT_tab(1,n);

// Teraz maj�c posortowan� tablic�, musz� policzy� powt�rzenia.
// Je�li powt�rzenia s� od 1 do 30, to wpisuj� w krotno�ci

for (int ii=1; ii<=30; ii++) krotnosci[ii]=0;
for (int ii=1; ii<=n; ii++) odp[ii]=0;

start = 1;
while (start<=n)
	{
	 koniec=start;
	 while (tab[koniec+1] == tab[koniec]) koniec++;
	 pom=koniec-start+1;
	 if(pom <= 30) krotnosci[pom]++;
	 else   { licz_powt++;   powtorzenia[licz_powt]=pom; }
	 start=koniec+1;
	}

// SORT_powtorzenia(1,licz_powt); // Zb�dne :)

// Mam posortowane powt�rzenia
// for (int ii=1; ii<=10; ii++)  printf("krotnosci[%ld] = %ld\n", ii, krotnosci[ii]);
// for (int ii=1; ii<=licz_powt; ii++)  printf("powt[%ld] = %ld\n",ii,powtorzenia[ii]);

// Dla ka�dego powt�rzenia dodaj� do tabeli odp. wynik dzielenia (powtorzenia przez pozycja).
// W przypadku krotno�ci mo�na to przyspieszy�.

for (int ii=1; ii<=30; ii++)   for (int jj=1; jj<=ii; jj++)   odp[jj] += int(ii/jj) * krotnosci[ii];

for (int ii=1; ii<=licz_powt; ii++)   for (int jj=1; jj<=powtorzenia[ii]; jj++)   odp[jj] += int(powtorzenia[ii]/jj);

for (int ii=1; ii<=n; ii++)   printf("%ld ",odp[ii]*ii);





return 0;
}