Cod sursa(job #2515879)

Utilizator euyoTukanul euyo Data 29 decembrie 2019 17:53:13
Problema Suma si numarul divizorilor Scor 60
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.25 kb
#include <stdio.h>
#define MOD 9973
#define MAX 1000000
#define MAXP 78499

char ciur[MAX + 1];
int p[MAXP];

int main() {
  FILE *fin = fopen( "ssnd.in", "r" );
  FILE *fout = fopen( "ssnd.out", "w" );
  int q, i, exp, k, d, nrd, expc, maxk;
  long long S, pow, n, pt;

  k = 0;
  for ( d = 2; d <= MAX; ++d ) {
    if ( ciur[d] == 0 ) {
      p[k++] = d;
      for ( i = d + d; i <= MAX; i += d ) {
        ciur[i] = 1;
      }
    }
  }
  maxk = k;
  fscanf( fin, "%d", &q );
  for ( i = 0; i < q; ++i ) {
    fscanf( fin, "%lld", &n );
    nrd = 1;
    S = 1;
    k = 0;
    exp = 0;
    while ( p[k] * p[k] <= n && maxk > k ) {
      pow = 1;
      exp = 0;
      while ( n % p[k] == 0 ) {
        ++exp;
        n /= p[k];
      }
      expc = exp;
      pow = 1;
      pt = p[k];
      while ( exp > 0 ) {
        if ( exp % 2 == 1 ) {
          pow = (pow * pt) % MOD;
        }
        pt = (pt * pt) % MOD;
        exp /= 2;
      }
      S = (S * ((pow * p[k] - 1) / (p[k] - 1))) % MOD;
      nrd *= (expc + 1);
      ++k;
    }
    if ( n > 1 ) {
      nrd *= 2;
      S = (S * ((n * n - 1) / (n - 1))) % MOD;
    }
    fprintf( fout, "%d %lld\n", nrd, S );
  }
  fclose( fin );
  fclose( fout );
  return 0;
}