Cod sursa(job #598720)

Utilizator mlazariLazari Mihai mlazari Data 26 iunie 2011 20:41:51
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include<fstream>

 #define NMAX 1000003
 #define MOD 9973

 using namespace std;

 ifstream fi("ssnd.in");
 ofstream fo("ssnd.out");
 long long n;
 int pr[NMAX],f[NMAX];
 char p[NMAX];
 long long fp[NMAX];
 bool isNotPr[NMAX];
 int t,nPr,nf;

 void primeNumbers() {
   int i,j;
   i=1;
   while(i<NMAX) {
     do ++i; while(i<NMAX && isNotPr[i]);
     pr[nPr++]=i;
     for(j=i+i;j<NMAX;j+=i) isNotPr[j]=1;
   }
 }

void decompose(long long n) {
  nf=0;
  int i=0;
  while(i<nPr && n>1) {
    if(!(n%pr[i])) {
      f[nf]=pr[i];
      p[nf]=0;
      fp[nf]=1;
      do {
        n/=f[nf];
        ++p[nf];
        fp[nf]*=f[nf];
      } while(!(n%f[nf]));
      ++nf;
    }
    ++i;
  }
  if(n>1) {
    f[nf]=1;
    p[nf]=1;
    fp[nf++]=n*n;
  }
}

long long nr() {
  long long res=1;
  for(int i=0;i<nf;i++) res*=(p[i]+1);
  return res;
}

long long sum() {
  long long res=1;
  for(int i=0;i<nf;i++) res=res*((fp[i]*f[i]-1)/(f[i]-1))%MOD;
  return res;
}

int main() {
  primeNumbers();
  fi>>t;
  while(t--) {
    fi>>n;
    decompose(n);
    fo<<nr()<<' '<<sum()<<"\n";
  }
  return 0;
}