Cod sursa(job #164362)

Utilizator raula_sanChis Raoul raula_san Data 24 martie 2008 00:05:27
Problema Indep Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <cstdio>
#include <bitset>
#include <vector>

using namespace std;

#define maxV 1001
#define maxN 501
#define pb push_back

bitset <maxV> U;
vector <int> V;

vector <int> R[maxN][maxV];

vector <int> Add(vector <int> A, vector <int> B)
{
    int i, j, t = 0;

    vector <int> R;
    R.clear();

    for(i=j=0; i<A.size() || j<B.size() || t; ++i, ++j)
    {
        if(i < A.size()) t += A[i];
        if(j < B.size()) t += B[j];

        R.pb(t%10);
        t /= 10;
    }

    while(R.size() && !R[R.size()-1]) R.pop_back();

    return R;
}

int Cmmdc(int x, int y)
{
    int r;

    while(y)
    {
        r = x % y;
        x = y;
        y = r;
    }

    return x;
}

int main()
{
    freopen("indep.in", "rt", stdin);
    freopen("indep.out", "wt", stdout);

    int i, n, x, max = 0;
    for(scanf("%d", &n), i=1; i<=n; ++i)
    {
        scanf("%d", &x);
        max = x > max ? x : max;

//        if(!U[x])
//        {
//            U[x] = 1;
            V.pb(x);
//        }

    }

    vector <int> :: iterator it = V.begin();

    R[1][*it].pb(1);

    int j, c;
    for(++it, i=2; it!=V.end(); ++i, ++it)
    {
        for(j=1; j<=max; ++j)
            if(R[i-1][j].size())
            {
                R[i][j] = R[i-1][j];

                c = Cmmdc(j, *it);
                R[i][c] = Add(R[i][c], R[i-1][j]);
            }
            
        vector <int> One;
        One.clear();

        One.pb(1);
        R[i][*it] = Add(R[i][*it], One);
    }

    if(!R[i-1][1].size()) printf("0");
    else
        for(j=R[i-1][1].size()-1; j>=0; --j) printf("%d", R[i-1][1][j]);

    return 0;
}