Cod sursa(job #1812262)

Utilizator TincaMateiTinca Matei TincaMatei Data 21 noiembrie 2016 22:21:38
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.63 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];

void euclid(int a, int b, int *x0, int *y0) {
  int x, y;
  if(b == 0) {
    x = 1;
    y = 0;
  } else {
    euclid(b, a % b, x0, y0);
    x = *y0;
    y = *x0 - a / b * (*y0);
  }
  *x0 = x;
  *y0 = y;
}

int inv(int a, int b) {
  int x, y;
  euclid(a, b, &x, &y);
  x = x % MOD;
  return (x + MOD) % MOD;
}

int main() {
  int t, fact, div, s, fr, p, prmod;
  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 && prime[j] * prime[j] <= x) {
      fr = 1;
      fact = 0;
      p = 1;
      prmod = prime[j] % MOD;
      while(x % prime[j] == 0) {
        x = x / prime[j];
        p = p * prmod % MOD;
        fact++;
      }
      p = p * prmod % MOD;
      fr = (p - 1 + MOD) * prec[prime[j] % MOD - 1] % MOD;
      s = s * fr % MOD;
      div = div * (1 + fact) % MOD;
      j++;
    }

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