Pagini recente » Cod sursa (job #1702242) | Cod sursa (job #1057497) | Cod sursa (job #2674387) | Cod sursa (job #2147220) | Cod sursa (job #1220)
Cod sursa(job #1220)
#include <stdio.h>
#include <string.h>
#define Nmax 501
#define Max(x, y) ((x) > (y) ? (x) : (y))
#define base 1000000000
#define lbase 9
int N;
int Cnt[2][1001][50];
int A[Nmax];
int K;
int c[1001];
int sol[1001];
void add(int A[], int B[])
{
int i, t = 0;
for (i=1; i<=A[0] || i<=B[0] || t; i++, t /= base)
A[i] = (t += A[i] + B[i]) % base;
A[0] = i - 1;
}
int gcd(int a, int b)
{
if (b == 0) return a;
return gcd(b, a%b);
}
int main()
{
int i = 0;
FILE *fin = fopen("indep.in", "rt");
fscanf(fin, "%d", &N);
for ( i = 1; i <= N; i++)
{
fscanf(fin, "%d", &A[i]);
K = Max(K, A[i]);
}
fclose(fin);
int lc = 1, lp = 0;
c[0] = 1, c[1] = 1;
for ( i = 1; i <= N; i++, lc = !lc, lp = !lp)
{
memcpy(Cnt[lc], Cnt[lp], sizeof(Cnt[lp]));
add(Cnt[lc][A[i]], c);
for (int j = 1; j <= K; j++)
{
if (Cnt[lp][j][0] == 0) continue;
add(Cnt[lc][gcd(j, A[i])], Cnt[lp][j]);
}
}
long long nsol = 0, t = 0;
for ( i = 1; i < Cnt[lp][1][0]; i++)
{
t = Cnt[lp][1][i];
for (int j = 1; j <= lbase; j++)
{
sol[++nsol] = t % 10;
t /= 10;
}
}
t = Cnt[lp][1][Cnt[lp][1][0]];
while (t) sol[++nsol] = t % 10, t /= 10;
sol[0] = nsol;
FILE *fout = fopen("indep.out", "wt");
//fprintf(fout, "%d\n", nsol);
//for ( i = Cnt[lp][1][0]; i > 0; i--)
// fprintf(fout, "%d", Cnt[lp][1][i]);
//fprintf(fout, "\n");
for (i = nsol; i > 0; i--)
fprintf(fout, "%d", sol[i]);
if (N == 1 && A[1] != 1) fprintf(fout, "%d", 0);
if (N > 1 && nsol == 0)
fprintf(fout, "0");
fclose(fout);
return 0;
}