Cod sursa(job #598746)

Utilizator mlazariLazari Mihai mlazari Data 26 iunie 2011 21:45:20
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.95 kb
#include<fstream>
#include<bitset>

#define NMAX 1000003
#define MOD 9973

using namespace std;

ifstream fi("ssnd.in");
ofstream fo("ssnd.out");
long long n;
int pr[NMAX],f,nr,sum;
char p;
long long fp;
bitset<NMAX+1> isNotPr;
int t,nPr,nf;

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

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

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