Cod sursa(job #1216)

Utilizator varuvasiTofan Vasile varuvasi Data 12 decembrie 2006 21:23:56
Problema Indep Scor 95
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.77 kb
#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, "1");
	if (N == 1 && A[1] != 1) fprintf(fout, "%d", 0);
	if (N > 1 && sol == 0)
	    fprintf(fout, "0");
    fclose(fout);
    
    return 0;
}