Pagini recente » Cod sursa (job #1409913) | Cod sursa (job #1719188) | Cod sursa (job #2334296) | Cod sursa (job #1276092) | Cod sursa (job #1115)
Cod sursa(job #1115)
#include <stdio.h>
#include <string.h>
#define Nmax 501
#define Max(x, y) ((x) > (y) ? (x) : (y))
int N;
int Cnt[2][Nmax][1000];
int A[Nmax];
int K;
void add(int A[], int B[])
{
int i, t = 0;
for (i=1; i<=A[0] || i<=B[0] || t; i++, t/=10000000)
A[i] = (t += A[i] + B[i]) % 10000000;
A[0] = i - 1;
}
int gcd(int a, int b)
{
if (b == 0) return a;
return gcd(b, a%b);
}
int main()
{
FILE *fin = fopen("indep.in", "rt");
fscanf(fin, "%d", &N);
for (int i = 1; i <= N; i++)
{
fscanf(fin, "%d", &A[i]);
K = Max(K, A[i]);
}
fclose(fin);
// Cnt[0][0][0] = 1;
// Cnt[0][0][1] = 1;
// Cnt[0][A[1]][0] = 1;
// Cnt[0][A[1]][1] = 1;
int lc = 1, lp = 0;
for (int i = 1; i <= N; i++, lc = !lc, lp = !lp)
{
memcpy(Cnt[lc], Cnt[lp], sizeof(Cnt[lp]));
int c[2]; c[0] = 1, c[1] = 1;
add(Cnt[lc][A[i]], c);
for (int j = 1; j <= K; j++)
{
int cm = gcd(j, A[i]);
if (Cnt[lp][j][0] == 0) continue;
add(Cnt[lc][gcd(j, A[i])], Cnt[lp][j]);
}
}
FILE *fout = fopen("indep.out", "wt");
for (int i = Cnt[lp][1][0]; i > 0; i--)
fprintf(fout, "%d", Cnt[lp][1][i]);
if (N == 1) fprintf(fout, "%d", 1);
if (N > 1 && Cnt[lp][1][0] == 0)
fprintf(fout, "0");
fclose(fout);
return 0;
}