Cod sursa(job #1472634)

Utilizator akaprosAna Kapros akapros Data 17 august 2015 14:44:46
Problema Indep Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
#include <cstdio>
#include <cstring>
#include <algorithm>
#define maxN 500
using namespace std;
int n, x, i, j, k, v[maxN];
long long dp[maxN + 2][maxN * 2 + 2], sol;
int gcd(int d, int i)
{
    int r;
    if (d < i)
        swap(d, i);
    r = d % i;
    while (r)
        d = i,
            i = r,
                r = d % i;
    return i;
}
void read()
{
    freopen("indep.in", "r", stdin);
    freopen("indep.out", "w", stdout);
    scanf("%d", &n);
    for (i = 1; i <= n; ++ i)
    {
        scanf("%d", &v[i]);
        dp[i][v[i]] = 1LL;
        for (j = 1; j * j <= v[i]; ++ j)
        {
            for (x = i - 1; x >= 1; -- x)
            {
                if (v[x] % j == 0)
                {
                    for (k = 1; k * j <= maxN * 2; ++ k)
                        if (gcd(k, v[i]) == 1)
                           dp[i][j] = (dp[i][j] + dp[x][j * k]);
                }
                else if (v[x] % (v[i] / j))
                {
                    for (k = 1; k * (v[i] / j) <= maxN * 2; ++ k)
                        if (gcd(k, v[i]) == 1)
                           dp[i][(v[i] / j)] = (dp[i][(v[i] / j)] + dp[x][(v[i] / j) * k]);
                }
            }
        }
        sol += dp[i][1];
    }
}
void write()
{
    freopen("indep.out", "w", stdout);
    printf("%lld", sol);
}
int main()
{
    read();
    write();
    return 0;
}