Cod sursa(job #1812357)

Utilizator TincaMateiTinca Matei TincaMatei Data 21 noiembrie 2016 23:38:15
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include <iostream>
//autismul se manifesta prin cai misterioase
const int MAX_N = 1000000;
const int MOD = 9973;
bool ciur[1+MAX_N];
int top;
int prime[MAX_N];
int prec[MOD];

int putere(int baza, int exp) {
  int ac;
  ac = 1;
  while(exp > 0) {
    if(exp % 2 == 1)
      ac = ac * baza % MOD;
    exp = exp / 2;
    baza = baza * baza % MOD;
  }
  return ac;
}

int inv(int a, int b) {
  return putere(a, b - 2);
}

int main() {
  int t, fact, div, s, fr;
  long long x;
  for(int d = 2; d * d <= MAX_N; ++d)
    if(!ciur[d])
      for(int i = d * d; i <= MAX_N; i = i + d)
        ciur[i] = true;

  for(int i = 2; i <= MAX_N; ++i)
    if(!ciur[i]) {
      prime[top] = i;
      top++;
    }

  for(int i = 1; i < MOD; ++i)
    prec[i] = inv(i, MOD);
  FILE *fin = fopen("ssnd.in", "r");
  FILE *fout = fopen("ssnd.out", "w");
  fscanf(fin, "%d", &t);
  for(int i = 0; i < t; ++i) {
    fscanf(fin, "%lld", &x);
    int j = 0;
    div = 1;
    s = 1;
    while(j < top && (long long)prime[j] * prime[j] <= x) {
      fr = 1;
      fact = 0;
      while(x % prime[j] == 0) {
        x = x / prime[j];
        fact++;
      }
      fr = (putere(prime[j] % MOD, fact + 1) - 1 + MOD) % MOD * prec[prime[j] % MOD - 1] % MOD;
      s = s * fr % MOD;
      div = div * (1 + fact);
      j++;
    }

    if(x > 1) {
      div = div * 2;
      fr = (x + 1) % MOD;
      s = s * fr % MOD;
    }
    fprintf(fout, "%d %d\n", div, s);
  }
  fclose(fin);
  fclose(fout);
  return 0;
}