Cod sursa(job #1700846)

Utilizator cella.florescuCella Florescu cella.florescu Data 11 mai 2016 14:55:03
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 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;
  baza%=MOD;
  while(exp){
    if(exp&1){
      rez=(baza*rez)%MOD;
    }
    baza=(baza*baza)%MOD;
    exp>>=1;
  }
  return rez;
}

int main()
{
    FILE *fin, *fout;
    long long n;
    int 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, "%lld", &n);
      d=0;
      nrd=smd=1;
      while(d<nrp && 1LL*prime[d]*prime[d]<=n){
        if(n%prime[d]==0){
          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;
}