Cod sursa(job #775849)

Utilizator ichigo2908mantu radu ichigo2908 Data 9 august 2012 10:25:13
Problema Indep Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
#include <cstdio>
using namespace std;

const short C=101;
const int M=1000000000;
int n, v[501], d[2][1001][C];

int cmmdc(int a, int b)
{
	int r;
	while(b!=0)
	{
		r = a % b;
		a = b;
		b = r;
	}
	return a;
}

void suma (int x[C], int y[C])
{
	int i, aux, t=0;
	for(i=1 ; i<=x[0] || i<=y[0] || t!=0 ; i++)
	{
		aux = t + x[i] + y[i];
		x[i] = aux % M;
		t = aux / M;
	}
	x[0] = i - 1;
}

void afisare (int x[C])
{
	int i;
	printf("%d", x[x[0]]);
	for(i=x[0]-1 ; i>0 ; i--)
		printf("%09d", x[i]);
}
/*
void reinit (bool a)
{
	int i, j;
	for(i=1 ; i<=1000 ; i++)
		for(j=0 ; j<C ; j++)
			d[a][i][j] = 0;
}
*/
void copy (int a)
{
	int i, j;
	for(i=0 ; i<=1000 ; i++)
		for(j=0 ; j<C ; j++)
			d[a][i][j]=d[1-a][i][j];
}

int main()
{
	int i, j, c, i1, i2;

	freopen("indep.in", "r", stdin);
	freopen("indep.out", "w", stdout);

	scanf("%d", &n);
	for(i=1;i<=n;i++)
		scanf("%d", &v[i]);

	d[0][0][0] = d[0][0][1] = 1;

	for(i=1 ; i<=n ; i++)
	{
		i1 = i % 2;
		i2 = 1 - i1;
		copy(i1);

		for(j=0 ; j<=1000 ; j++)
		{
			c = cmmdc(v[i], j);
			suma(d[i1][c], d[i2][j]);
		}
	}

	afisare(d[n%2][1]);

	return 0;
}