Cod sursa(job #1700833)

Utilizator cella.florescuCella Florescu cella.florescu Data 11 mai 2016 14:35:29
Problema Suma si numarul divizorilor Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include <cstdio>
#define MAXN 1000000
#define MOD 9973

using namespace std;

int prime[MAXN], low[MAXN+1];

inline int mypow(int baza, int exp){
  int rez=1;
  while(exp){
    if(exp&1){
      rez=(baza*rez)%MOD;
    }
    baza=(baza*baza)%MOD;
    exp>>=1;
  }
  return rez;
}

int main()
{
    FILE *fin, *fout;
    int n, nrp, i, j, t, d, expo, nrd, smd;
    nrp=0;
    for(i=2; i<=MAXN; i++){
      if(low[i]==0){
        low[i]=i;
        prime[nrp++]=i;
      }
      for(j=0; j<nrp && i*prime[j]<=MAXN && prime[j]<=low[i]; j++)
        low[prime[j]*i]=prime[j];
    }
    fin=fopen("ssnd.in", "r");
    fscanf(fin, "%d", &t);
    fout=fopen("ssnd.out", "w");
    for(i=0; i<t; i++){
      fscanf(fin, "%d", &n);
      d=0;
      nrd=smd=1;
      while(d<nrp && 1LL*prime[d]*prime[d]<=n){
        expo=0;
        while(n%prime[d]==0){
          ++expo;
          n/=prime[d];
        }
        nrd*=(expo+1);
        smd=((smd*(mypow(prime[d], expo+1)-1+MOD)%MOD)*(mypow(prime[d]-1, MOD-2)))%MOD;
        ++d;
      }
      if(n>1){
        nrd*=2;
        smd=(smd*(n+1))%MOD;
      }
      fprintf(fout, "%d %d\n", nrd, smd);
    }
    fclose(fin);
    fclose(fout);
    return 0;
}