Cod sursa(job #1903306)

Utilizator mihai.alphamihai craciun mihai.alpha Data 5 martie 2017 09:32:33
Problema Indep Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.13 kb
#include <stdio.h>


FILE *fin = fopen("indep.in", "r");
FILE *fout = fopen("indep.out", "w");

#define MAX_N 500
#define CONST 1000

int N;

inline int gcd(int a, int b)  {
    int r;
    while(b)  {
        r = a % b;
        a = b;
        b = r;
    }
    return a;
}

struct Number  {
    #define Base 1000000000
    #define NR 120
    int a[NR] = {0};
    inline void add(Number b)  {
        int i, rest = 0;
        for(i = 1;i <= a[0] || i <= b.a[0] || rest > 0;i++)
            a[i] = (a[i] + b.a[i] + rest), rest = a[i] / Base, a[i] %= Base;
        a[0] = i - 1;
    }
    inline void print()  {
        fprintf(fout, "%d", a[a[0]]);
        for(int i = a[0] - 1;i > 0;i--)
            fprintf(fout, "%.9d", a[i]);
    }
};

Number dp[CONST + 1], one;


int main()  {
    fscanf(fin, "%d", &N);
    int v;
    one.a[0] = 1, one.a[1] = 1;
    for(int i = 1;i <= N;i++)  {
        fscanf(fin, "%d", &v);
        for(int j = 1;j <= CONST;j++)  {
        dp[gcd(j, v)].add(dp[j]);
        }
        dp[v].add(one);
    }
    dp[1].print();
    fclose(fin);
    fclose(fout);
    return 0;
}