Pagini recente » Cod sursa (job #2887560) | Cod sursa (job #1026415) | Cod sursa (job #2235761) | Cod sursa (job #2261619) | Cod sursa (job #1631639)
#include <bits/stdc++.h>
using namespace std;
const int base = 1e7;
void Init(vector<int>&a, int x)
{
a.clear();
for(; x ; x /= base)
a.push_back(x % base);
}
void adauga(vector<int> &a, vector<int> b) {
a.resize(max(a.size(), b.size()));
b.resize(max(a.size(), b.size()));
int t = 0;
for(int i = 0; i < (int)a.size(); ++i)
{
a[i] += b[i] + t;
t = a[i] / base;
a[i] %= base;
}
if(t) a.push_back(t);
}
void inmultire(vector<int>&a, int x)
{
int t = 0;
for(auto &val : a)
{
val = val * x + t;
t = val / base;
val %= base;
}
for(; t; t /= base)
a.push_back(t % base);
}
void afis(const vector<int>& a)
{
if(a.size() == false) {
printf("%d\n", 0);
return;
}
printf("%d", a[a.size() - 1]);
for(int i = a.size() - 2 ; i >= 0 ; --i)
printf("%07d", a[i]);
printf("\n");
}
inline int compgcd(int a , int b)
{
if(b == 0)
return a ;
return compgcd(b , a % b);
}
const int MAX_NUM = 1002;
int N;
vector<int>A;
int gcd[MAX_NUM][MAX_NUM];
void Read()
{
freopen("indep.in", "r", stdin);
scanf("%d", &N);
A = vector<int>(N);
for(int i = 0; i < N; ++i)
scanf("%d", &A[i]);
for(int i = 1; i <= 1000; ++i)
for(int j = i ; j <= 1000 ; ++j)
gcd[i][j] = gcd[j][i] = compgcd(i , j);
}
vector<int>dp[2][1007];
void Solve()
{
adauga(dp[0][A[0]], vector<int>(1, 1));
bool crt = 1;
for(int i = 1; i < N; ++i, crt ^= 1)
{
for(int T = 1; T <= 1000; ++T)
dp[crt][T] = dp[crt ^ 1][T];
for(int j = 1; j <= 1000; ++j)
{
adauga(dp[crt][gcd[j][A[i]]] , dp[crt ^ 1][j]);
}
adauga(dp[crt][A[i]], vector<int>(1, 1));
}
freopen("indep.out", "w", stdout);
afis(dp[crt ^ 1][1]);
}
int main()
{
Read();
Solve();
}