Cod sursa(job #498838)

Utilizator ooctavTuchila Octavian ooctav Data 6 noiembrie 2010 10:49:43
Problema Indep Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.18 kb
#include<cstdio>
#include<iostream>
using namespace std;

const int NMAX = 505;
const int divmax = 1005;
const int CIFMAX = 500;
const int MOD = 10;

int N;
int A[NMAX];
int C[2][divmax][CIFMAX];

void citire()
{
	cin >> N;
	for(int i = 1 ; i <= N ; i++)
		cin >> A[i];
}

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

void curata(int i)
{
	for(int j = 1 ; j < divmax ; j++)
		for(int k = 0 ; k < CIFMAX ; k++)
			C[i][j][k] = 0;
}

void aduna(int A[], int B[])
{
	int i = 1, t = 0;
	for(; i <= A[0] || i <= B[0] || t ; i++, t /= MOD)
		A[i] = (t += A[i] + B[i]) % MOD;
	A[0] = i - 1;
}

void dinamic()
{
	C[1][A[1]][++C[1][A[1]][0]] = 1;
	for(int i = 2 ; i <= N ; i++)
	{
		curata(i % 2);
		for(int j = 1 ; j <= 1000 ; j++)
			aduna(C[i % 2][j], C[(i - 1) % 2][j]);
		for(int j = 1 ; j <= 1000 ; j++)
			aduna(C[i % 2][cmmdc(j, A[i])], C[(i - 1) % 2][j]);
	}
}

void scrie()
{
	for(int k = C[N % 2][1][0] ; k ; k--)
		printf("%d\n", C[N % 2][1][k]);
}

int main()
{
	freopen("indep.in", "r", stdin);
	freopen("indep.out", "w", stdout);
	citire();
	dinamic();
	scrie();
	return 0;
}