Cod sursa(job #235896)

Utilizator ProtomanAndrei Purice Protoman Data 26 decembrie 2008 11:59:26
Problema Indep Scor 35
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 kb
#include <stdio.h>
#include <algorithm>
#define bz_num 1000000000
#define mx 1024
#define ull unsigned long long

using namespace std;

int n, a;
int sol[mx][mx], ad[mx][mx], cmmdc[mx][mx];

int gcd(int f_rez, int b)
{
	while (b)
	{
		int c = f_rez % b;
		f_rez = b;
		b = c;
	}
	return f_rez;
}

void aduna(int *vct_sum, int vct_ter[])
{
    ull i, t = 0;
    for (i = 1; i <= max(vct_sum[0], vct_ter[0]) || t; i++, t /= (ull) bz_num)
        vct_sum[i] = (t += (ull) vct_sum[i] + vct_ter[i]) % bz_num;
    vct_sum[0] = i - 1;
}


int main()
{
	freopen("indep.in","r",stdin);
	freopen("indep.out","w",stdout);
	scanf("%ld", &n);
	for (int i = 1; i <= 1000; i++)
		for (int j = 1; j <= 1000; j++)
			cmmdc[i][j] = cmmdc[j][i] = gcd(i, j);
	for (int i = 1; i <= n; i++)
	{
		scanf("%ld", &a);
		memset(ad, 0, sizeof(ad));
		for (int j = 1; j <= 1000; j++)
		{
			ad[j][0] = 1;
			ad[j][1] = 0;
		}
		ad[a][1] = 1;
		for (int j = 1; j <= 1000; j++)
			aduna(ad[cmmdc[a][j]], sol[j]);
		for (int j = 1; j <= 1000; aduna(sol[j], ad[j]), j++);
	}
	for (; sol[1][0]; sol[1][0]--)
		printf("%ld", sol[1][sol[1][0]]);
	fclose(stdin);
	fclose(stdout);
	return 0;
}