Cod sursa(job #1112)

Utilizator varuvasiTofan Vasile varuvasi Data 12 decembrie 2006 18:41:18
Problema Indep Scor 25
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#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/=100000)  
               A[i] = (t += A[i] + B[i]) % 100000;  
       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;
}