Cod sursa(job #343965)

Utilizator mgntMarius B mgnt Data 27 august 2009 21:40:58
Problema Indep Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.88 kb
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;

int const base   = 1000000 ;
int const maxlen = 30      ;

class Numar {
public:
  Numar & operator  = (Numar const & v);
  Numar & operator  = (int v);
  Numar & operator += (Numar const & v);
  friend ofstream & operator << (ofstream & o, Numar const & v);
    
private:
  int d_ [maxlen];
};

int const N=500;
int const M=1000;
int V[N];
Numar C[2][1+M];
  // C[s][i] - numarul de siruri pentru care cmmdc este i
  // folosind doar primele s elemente din sir

int
cmmdc (int a, int b) {
  int c;
  while ( a ) {
    c = b % a ;
    b = a ;
    a = c ;
  }
  return b;
}

int
main ( ) {
  ifstream sin("indep.in"); int n, s, k, i, d,x=0,y=1,z; Numar unu; unu=1;
  sin>>n; for ( s=0; n>s; ++s ) { sin>>V[s]; }
  for ( s=1; M>=s; ++s ) { C[0][s]=0; }
  for ( s=1; n>=s; ++s ) { k=V[s-1]; 
    for ( i=1; M>=i; ++i ) { C[y][i]=C[x][i]; } C[y][k]+=unu;
    for ( i=1; M>=i; ++i ) { d=cmmdc(k,i); C[y][d]+=C[x][i]; }
    z=y;y=x;x=z;
  }
  ofstream sout("indep.out"); sout<<C[x][1]<<endl;
  return 0;
}

Numar &
Numar::operator = (Numar const & v)
{
  int s;
  for ( s=0; maxlen>s; ++s ) { d_[s]=v.d_[s]; }
  return *this;
}

Numar &
Numar::operator = (int v) // 0 < v < base
{
  int s; for ( s=0; maxlen>s; ++s ) { d_[s]=0; }
  d_[0]=v; return * this;
}

Numar &
Numar::operator += (Numar const & v) { // v <= * this
  int t=0, s, a;
  for (s=0; maxlen>s; ++s ) {
    a=d_[s]+v.d_[s]+t;
    t=a/base; d_[s]=a%base;
  }
  return * this;
}

void fixz ( ofstream & o , int base, int d ) {
  base/=10;
  while ( (base>d) && (0<base) ) {
    o<<0; base/=10;
  }
  if ( 0 != base ) { o<<d; }
}

ofstream & operator << (ofstream & o, Numar const & v) {
  int s;
  for ( s=maxlen-1; s>=0; s-- ) {
    if (0!=v.d_[s]) { break; }
  }
  if (-1 == s) { o <<0; return o; }
  o<<v.d_[s]; --s;
  while ( 0 <= s ) {
    fixz(o,base,v.d_[s]); --s;
  }
  return o;
}