Cod sursa(job #645332)

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

#define BIG_NUMBER 9973

using namespace std;

vector< pair<long,int> > get_divisors_power( long long n ){
  int i, num;
  vector< pair<long,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,long long> backtrack( 
    int index, 
    long long P, 
    vector< pair<long, int> > v 
  ){
  if( index >= v.size() ){
    return make_pair( 1, (long long) P );
  } else {
    long long prod = 1;
    int s = 0;
    int n = 0;
    for( int i=0; i<=v[index].second; ++i ){
      pair<int, long long> back = backtrack( index+1, P*prod, v );
      n += back.first;
      s += (back.second % BIG_NUMBER);
      prod *= v[index].first;
    }
    return make_pair( n, s % BIG_NUMBER);
  }
}

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

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