Cod sursa(job #1240158)

Utilizator dr_personalityEftime Andrei Horatiu dr_personality Data 10 octombrie 2014 16:50:05
Problema Indep Scor 95
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.6 kb
#include <fstream>
#include<vector>
using namespace std;
ifstream in("indep.in");
ofstream out("indep.out");
 
const int nmax = 506, vmax = 1006, base = 100000000;
vector <int> d[nmax][vmax];
int n, v[nmax], maxim;
 
/*int cmmdc(int a, int b)
{
    if(!b)
        return a;
    else
        return cmmdc(b, a%b);
}*/
int cmmdc(int a, int b) {
    int chestie;
    while(b!=0) 
	{
        chestie = a % b;
        a = b;
        b = chestie;
    }
    return a;
}

void adunare(vector <int> &x, vector <int> y)
{
    int minte = 0;
    for(int i = 0; i<(int)x.size() || i < (int)y.size() || minte != 0; i++)
	{
        if (i==(int)x.size())
		{
            x.push_back(0);
        }

        if (i<(int)y.size())
		{
            x[i] += y[i];
        }

        x[i] += minte;
        minte = x[i] / base;
        x[i] %= base;
    }
}

void norm(int a)
{
	if(a>base / 10)
	{
		return;
	}
	out<<0;
	norm(a * 10);
}

int main()
{
	int player_unu=0;
    in>>n;
 
    for(int i = 1; i<=n; i++)
    {
        in>>v[i];
		if(v[i]>maxim)
			maxim = v[i];
    }
	
	d[0][0].push_back(1);
    for(int i = 1; i<=n; i++)
    {
        for(int j = 0; j<=maxim; j++)
		{
			d[i][j] = d[i - 1][j];
		}

        for(int j = 0; j<=maxim; j++)
        {
            adunare(d[i][cmmdc(j, v[i])], d[i - 1][j]);
        }
    }

	if(d[n][1].size()==0)
	{
		out<<0<<'\n';
		return 0;
	}
 
    out<<d[n][1][(int)d[n][1].size() - 1];
	for(int i = (int)d[n][1].size() - 2; i>=0; i--)
	{
		norm(d[n][1][i]);
		out<<d[n][1][i];
	}
	out<<'\n';

    return player_unu;
}