Cod sursa(job #257889)

Utilizator andrei-alphaAndrei-Bogdan Antonescu andrei-alpha Data 14 februarie 2009 11:51:51
Problema Indep Scor 65
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
using namespace std;

#include <set>
#include <map>
#include <list>
#include <deque>
#include <stack>
#include <queue>
#include <cmath>
#include <cstdio>
#include <vector>
#include <string>
#include <bitset>
#include <utility>
#include <algorithm>

#define pb push_back
#define sz size
#define f first
#define s second
#define II inline
#define ll long long
#define db double
#define FOR(i,a,b) for(int i=a;i<=b;++i)
#define all(v) v.begin() , v.end()
#define CC(v) memset((v),0,sizeof((v)))
#define CP(v,w) memcpy((v),(w),sizeof((w)))
#define mp make_pair

#define IN  "indep.in"
#define OUT "indep.out"
#define N_MAX 1<<9
#define mod 100000000

typedef vector<int> VI;
typedef pair<int,int> pi;
typedef vector<string> VS;

int N;
int unu[2],V[N_MAX],C[1<<10][1<<4],D[1<<10][1<<4];

II void scan()
{
	freopen(IN,"r",stdin);
	freopen(OUT,"w",stdout);
	scanf("%d\n",&N);
	FOR(i,1,N)
		scanf("%d",V+i);
}

II void add(int A[], int B[])
{
    int i, t = 0;
    for (i=1; i<=A[0] || i<=B[0] || t; i++, t/=mod)
        A[i] = (t += A[i] + B[i]) % mod;
    A[0] = i - 1;
}


II void solve()
{
	unu[0] = unu[1] = 1;
	for(int i=N;i>=1;--i)
	{
		FOR(j,1,1000)
			add(D[ __gcd(j,V[i]) ],C[j]);
		add(D[ V[i] ],unu);	
		CP(C,D);
	} 

	for(int i=C[1][0];i>=1;--i)
		if(i!=C[1][0])
			printf("%08d",C[1][i]);
		else
			printf("%d",C[1][i]);
	printf("\n");	
}	

int main()
{
	scan();
	solve();
	return 0;
}