Cod sursa(job #1111952)

Utilizator vladtarniceruVlad Tarniceru vladtarniceru Data 19 februarie 2014 11:55:26
Problema Indep Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.16 kb
#include <iostream>
#include <fstream>
#include <cstdio>
#include <cstring>
using namespace std;
 
int n, gcd[1005][1005];
 
inline int fgcd(int a, int b) {
    if (!b) return a;
    return fgcd(b, a % b);
}
 
 
const int base = 1000 * 1000 * 1000;
int dp[1005][205], unu[205];
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;
}
void write(int a) {
    printf("%.9d", a);
}
 
int main() {
    #ifdef INFOARENA
    freopen("indep.in", "r", stdin);
    freopen("indep.out", "w", stdout);
    #endif
     
    for (int i = 1; i <= 1000; ++i)
        for (int j = i; j <= 1000; ++j)
            gcd[i][j] = gcd[j][i] = fgcd(i, j);
     
    unu[0] = unu[1] = 1;
     
    scanf("%d", &n);
    for (int ni = 1; ni <= n; ++ni) {
        int a;
        scanf("%d", &a);
         
        for (int i = 1; i <= 1000; ++i)
            add(dp[gcd[i][a]], dp[i]);
        add(dp[a], unu);
    }
     
    int crl = n % 2;
    printf("%d", dp[1][dp[1][0]]);
    for (int i = dp[1][0] - 1; i >= 1; --i)
        write(dp[1][i]);
}