Cod sursa(job #532035)

Utilizator andreitheo87Teodorescu Andrei-Marius andreitheo87 Data 10 februarie 2011 18:50:52
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include <stdio.h>
#include <vector>

using namespace std;

const int MOD = 9973;

void calcNdivSdiv(long long n, int* nndiv, long long* ssdiv, const vector<int>& primes) {
  int ndiv = 1;
  long long sdiv = 1;
  int div = 2, pos_div = 0;
  int nr;
  long long divPowNr;
  while ((long long) div * div <= n) {
    if (n%div == 0) {
      nr = 1;
      divPowNr = div;
      n/=div;
      while (n%div == 0) {
	++nr;
	divPowNr *= div;
	n /= div;
      }
      if (nr) {
	ndiv *= (nr + 1);
	sdiv *= (divPowNr*div - 1) / (div-1);
      }
    }
    pos_div++;
    div = primes[pos_div];
  }
  if (n != 1) {
    ndiv *= 2;
    sdiv *= (n+1);
  }
  *nndiv = ndiv;
  *ssdiv = sdiv;
}

void compute_primes(int n, vector<int>* primes) {
  primes->clear();
  vector<char> prim(n, true);
  for(int i=2; i<=n; i++)
    if( prim[i]==1 ) {
      for(int j=2*i; j<=n; j+=i) prim[j] = 0;
      primes->push_back(i);
    }
}

int main() {
  freopen("ssnd.in", "r", stdin);
  freopen("ssnd.out", "w", stdout);
  int nrt;
  scanf("%d", &nrt);
  vector<int> primes;
  compute_primes(1001000, &primes);
  while (nrt--) {
    long long n;
    scanf("%lld", &n);
    long long sdiv;
    int ndiv;
    calcNdivSdiv(n, &ndiv, &sdiv, primes);
    printf("%d ", ndiv % MOD);
    printf("%d\n", sdiv % MOD);
  }
  return 0;
}