Cod sursa(job #3189424)

Utilizator ezluciPirtac Eduard ezluci Data 5 ianuarie 2024 12:44:03
Problema Indep Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.21 kb
using namespace std;
#ifdef EZ
   #include "./ez/ez.h"
   const string FILE_NAME = "test";
#else
   #include <bits/stdc++.h>
   const string FILE_NAME = "indep";
#endif
#define mp make_pair
#define ll long long
#define pb push_back
#define fi first
#define se second
#define cin fin
#define cout fout
ifstream fin (FILE_NAME + ".in");
ofstream fout (FILE_NAME + ".out");

const int BAZ = 1e9;

int n;
int v[501];
int dp[2][1001][18];
int one[18];

void add(int a[18], int b[18])
{
   int cnt = 0;
   for (int i = 0; i < 18; ++i)
   {
      cnt += a[i] + b[i];
      a[i] = cnt % BAZ;
      cnt /= BAZ;
   }
}


int main()
{
   cin >> n;
   for (int i = 1; i <= n; ++i)  cin >> v[i];
   one[0] = 1;

   dp[1][v[1]][0] = 1;
   for (int i = 2; i <= n; ++i)
   {
      memcpy(dp[i&1], dp[i-1&1], 1001*18*4);
      add(dp[i&1][v[i]], one);
      for (int j = 1; j <= 1000; ++j)
         add(dp[i&1][__gcd(j, v[i])], dp[i-1&1][j]);
   }

   bool out = 0;
   for (int i = 17; i >= 0; --i)
      if (out || dp[n&1][1][i])
      {
         if (out)
            for (int j = 9 - max((double) -1, log10(dp[n&1][1][i])); j; --j)   cout << '0';
         cout << dp[n&1][1][i];
         out = 1;
      }
   
   if (cout.tellp() == 0)  cout << '0';
}