Cod sursa(job #473302)

Utilizator mlazariLazari Mihai mlazari Data 28 iulie 2010 18:10:59
Problema Suma si numarul divizorilor Scor 0
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],isPr[NMAX],f[NMAX/4],p[NMAX/4],fp[NMAX/4];
 int t,nPr,nf;

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

void decompose(long long n) {
  nf=0;
  int i=0;
  while(i<NMAX && n>1) {
    if(!(n%pr[i])) {
      f[nf]=pr[i];
      p[nf]=0;
      fp[nf]=1;
      while(!(n%pr[i])) {
        n/=pr[i];
        ++p[nf];
        fp[nf]*=f[nf];
      }
      ++nf;
    }
    ++i;
  }
  if(n>1) {
    f[nf]=n;
    p[nf]=1;
    fp[nf++]=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;
}