Cod sursa(job #2199964)

Utilizator Dobricean_IoanDobricean Ionut Dobricean_Ioan Data 29 aprilie 2018 19:10:28
Problema Indep Scor 85
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <cstdio>
#include <cstring>
 
using namespace std;
 
int gcd(int a, int b) {
  while (b) {
    int r = a % b;
    a = b;
    b = r;
  }
  return a;
}
 
 const int Base = 1.e6;
class Big{
     
    enum { MAX = 50 };
    int x[MAX];
    int n;
public:
    Big(int nr = 0);
    int& operator [] (int i) { return x[i]; }
    friend Big operator * (Big A, int B);
    friend Big operator + (Big o1, Big o2);
    void afis() {
		printf("%d",x[n]);
		for ( int i = n - 1; i >= 1; --i)
			printf("%06d", x[i]);
	}
      
};
  
Big dp[1005];
 
int main() {
  freopen("indep.in", "r", stdin);
  freopen("indep.out", "w", stdout);
 
  int n;
  scanf("%d", &n);
  int k = 1;
  for (int i = 1; i <= n; ++i) {
    int x;
    scanf("%d", &x);
    for (int j = 1; j <= 1000; ++j)
      dp[gcd(j, x)] = dp[gcd(j,x)] + dp[j];
    dp[x]=dp[x] + k;
  }
 
  dp[1].afis();
 
  return 0;
}

  
Big operator + (Big a, Big b)
{
    Big c; int i, t = 0;
    for (i = 1; i <= a.n or i <= b.n or t; ++i, t /= Base)
        c[i] = (t += a[i] + b[i]) % Base;
    c.n = i - 1;
    return c;
}
  
Big operator * (Big a, int b)
{
    Big c; int i, t = 0;
    if ( b == 0 ) return c;
    for (i = 1; i <= a.n or t; ++i, t /= Base)
        c[i] = (t += a[i] * b) % Base;
    c.n = i - 1;
    return c;
}
  
Big::Big(int nr) {
    memset(x, 0, sizeof(x)); n = 0; 
    while ( nr ) {
        x[++n] = nr % Base; nr /= Base  ;
    }
}