Cod sursa(job #1700834)

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

using namespace std;

char ciur[MAXN+1], prime[MAXN];

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, t, d, expo, nrd, smd;
    nrp=0;
    for(i=2; i*i<=MAXN; i++)
      if(ciur[i]==0){
        prime[nrp++]=i;
        for(d=i*i; d<=MAXN; d+=i)
          ciur[d]=1;
      }
    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=(1LL*smd*(mypow(prime[d], expo+1)-1+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;
}