Cod sursa(job #214650)

Utilizator andrei.12Andrei Parvu andrei.12 Data 15 octombrie 2008 15:22:56
Problema Indep Scor 75
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.02 kb
#include<stdio.h>

#define lg 505
#define nrm 200

int n, i, j, k, sol[nrm], a[lg][40][nrm], q[lg][40], poz[lg][1005], v[lg], x;

void add(int a[], int b[]){
	int i, p = 0;

	for (i = 1; i <= a[0] || i <= b[0] || p; i ++, p /= 10)
		a[i] = (p += a[i] + b[i]) % 10;
	a[0] = i-1;
}
int gcd(int a, int b){
	if (!b)
		return a;
	return gcd(b, a % b);
}

int main()
{
	freopen("indep.in", "rt", stdin);
	freopen("indep.out", "wt", stdout);
	
	scanf("%d", &n);
	for (i = 1; i <= n; i ++){
		scanf("%d", &v[i]);

		for (j = 1; j*j <= v[i]; j ++)
			if (v[i] % j == 0){
				q[i][++ q[i][0]] = j; poz[i][j] = q[i][0];
				q[i][++ q[i][0]] = v[i] / j; poz[i][v[i] / j] = q[i][0];
			}
		a[i][2][0] = a[i][2][1] = 1;
	}
	
	if (v[1] == 1)
		sol[0] = sol[1] = 1;
	for (i = 2; i <= n; i ++){
		for (j = 1; j < i; j ++)
			for (k = 1; k <= q[j][0]; k ++){
				x = gcd(v[i], q[j][k]);

				add(a[i][poz[i][x]], a[j][k]);
			}
		add(sol, a[i][1]);
	}

	for (i = sol[0]; i; i --)
		printf("%d", sol[i]);
	if (!sol[0])
		printf("0");
	printf("\n");

	return 0;
}