Cod sursa(job #1599459)

Utilizator matei_cChristescu Matei matei_c Data 13 februarie 2016 21:33:41
Problema Indep Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<cstring>
#include<set>
#include<map>
#include<cmath>
#include<climits>
#include<ctime>
#include<iomanip>
using namespace std ;

#define baza 1000000000
#define maxcc 50
#define maxx 1010

int N ;

int sol[maxx][maxcc], unu[maxcc] ;

int gcd(int a, int b)
{
    if( a == 0 || b == 0 )
        return a + b ;

    if( a > b )
        return gcd( a % b, b ) ;

    return gcd( a, b % a ) ;
}

void adunare(int v[maxcc], int w[maxcc])
{
    int t = 0 ;

    for(int i = 1; i <= max( v[0], w[0] ) || t > 0; ++i )
    {
        t = ( v[i] + w[i] + t ) ;
        v[i] = t % baza ;
        t /= baza ;

        v[0] = i ;
    }
}

void printare(int v[])
{
    cout << v[ v[0] ] ;

    for(int i = v[0] - 1; i > 0; --i )
        printf("%09d", v[i]);
}

void init()
{
    unu[0] = unu[1] = 1 ;
}

void calc()
{
    cin >> N ;

    for(int i = 1; i <= N; ++i)
    {
        int x ;
        cin >> x ;

        for(int j = 1; j < maxx; ++j )
        {
            int gg = gcd(x, j) ;

            adunare( sol[gg], sol[j] ) ;
        }

        adunare( sol[x], unu ) ;
    }
}

int main()
{
	std::ios_base::sync_with_stdio(false) ;

	freopen("indep.in", "r", stdin);
	freopen("indep.out", "w", stdout);

	init() ;

	calc() ;

	printare( sol[1] ) ;

	return 0 ;
}