Cod sursa(job #2719939)

Utilizator mihaipriboimihailucapriboi mihaipriboi Data 10 martie 2021 13:56:48
Problema Suma si numarul divizorilor Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.23 kb
// Mihai Priboi

#include <bits/stdc++.h>

#define MAXD 1000000
#define MOD 9973

int ciur[MAXD + 1];

long long lgput( long long x, int p ) {
  long long rez;
  rez = 1;
  while( p ) {
    if( p % 2 == 1 )
      rez *= x;
    x *= x;
    p /= 2;
  }
  return rez;
}

int main() {
  FILE *fin, *fout;
  int t, i, d, k, div, p;
  long long sum_div, sum, x, diviz, n;

  for( d = 2; d * d <= MAXD; d++ )
    if( ciur[d] == 0 )
      for( i = d * d; i <= MAXD; i += d )
        ciur[i] = 1;

  k = 0;
  for( i = 2; i <= MAXD; i++ )
    if( ciur[i] == 0 )
      ciur[k++] = i;

  fin = fopen( "ssnd.in", "r" );
  fout = fopen( "ssnd.out", "w" );

  fscanf( fin, "%d", &t );
  for( k = 0; k < t; k++ ) {
    fscanf( fin, "%lld", &n );

    d = 0;
    diviz = ciur[d];
    sum_div = 1;
    div = 1;
    while( diviz * diviz <= n ) {
      p = 0;
      while( n % diviz == 0 ) {
        p++;
        n /= diviz;
      }
      sum_div *= (lgput(diviz, p + 1) - 1) / (diviz - 1);
      sum_div %= MOD;
      div *= p + 1;
      d++;
      diviz = ciur[d];
    }
    if( n > 1 ) {
      sum_div *= (n * n - 1) / (n - 1);
      sum_div %= MOD;
      div *= 2;
    }

    fprintf( fout, "%d %lld\n", div, sum_div );
  }

  fclose( fin );
  fclose( fout );
  return 0;
}