Pagini recente » Cod sursa (job #2246965) | Cod sursa (job #2561164) | Cod sursa (job #1469701) | Cod sursa (job #1625892) | Cod sursa (job #1163)
Cod sursa(job #1163)
#include <stdio.h>
#include <string.h>
#define Nmax 501
#define Max(x, y) ((x) > (y) ? (x) : (y))
#define base 1000000000
int N;
long long Cnt[2][1001][30];
int A[Nmax];
int K;
long long c[2];
void add(long long A[], long long B[])
{
long long 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]);
}
}
FILE *fout = fopen("indep.out", "wt");
for ( i = Cnt[lp][1][0]; i > 0; i--)
fprintf(fout, "%lld", Cnt[lp][1][i]);
if (N == 1 && A[1] != 1) fprintf(fout, "%d", 1);
if (N > 1 && Cnt[lp][1][0] == 0)
fprintf(fout, "0");
fclose(fout);
return 0;
}