Cod sursa(job #645331)

Utilizator tak3rStefan Mirea tak3r Data 9 decembrie 2011 11:21:05
Problema Suma si numarul divizorilor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include<cstdio>
#include<vector>
#include<complex>

#define BIG_NUMBER 9973

using namespace std;

vector< pair<int,int> > get_divisors_power( int n ){
  int i, num;
  vector< pair<int,int> > v;
  
  num = 0;
  while( n % 2 == 0 ){
    ++num;
    n /= 2;
  }
  if( num > 0 ){
    v.push_back( make_pair( 2, num ) );
  }
  
  for( i=3; i<=2*n; i+=2 ){
    num = 0;
    while( n % i == 0 ){
      ++num;
      n /= i;
    }
    if( num > 0 ){
      v.push_back( make_pair( i, num ) );
    }
  }
  
  return v;
}

pair<int,int> backtrack( 
    int index, 
    int P, 
    int N,
    int S,
    vector< pair<int, int> > v 
  ){
  if( index >= v.size() ){
    return make_pair( N+1, S+P );
  } else {
    int prod = 1;
    int s = 0;
    int n = 0;
    for( int i=0; i<=v[index].second; ++i ){
      pair<int, int> back = backtrack( index+1, P*prod, 0, 0, v );
      n += back.first;
      s += back.second;
      prod *= v[index].first;
    }
    return make_pair( N+n, S+s );
  }
}

void ssnd( long n ){
  vector< pair<int,int> > v = get_divisors_power( n );
  pair<int, int> sn = backtrack( 0, 1, 0, 0, v );
  printf("%d %d\n", sn.first, sn.second );
}

int main(){
  
  freopen( "ssnd.in", "r", stdin );
  freopen( "ssnd.out", "w", stdout );
  
  int n,i;
  long tmp;
  
  scanf( "%d", &n );
  for( i=0; i<n; ++i ){
    scanf( "%ld", &tmp );
    ssnd( tmp );
  }
  
  return 0;
  
}