Pagini recente » Diferente pentru implica-te/arhiva-educationala intre reviziile 223 si 43 | Cod sursa (job #2547601) | Cod sursa (job #2063011) | Cod sursa (job #27763) | Cod sursa (job #498838)
Cod sursa(job #498838)
#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;
}