Cod sursa(job #2227198)

Utilizator BarbumateiBarbu Matei Barbumatei Data 31 iulie 2018 14:53:13
Problema Suma si numarul divizorilor Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include <stdio.h>
#include <stdlib.h>
#define MAX 1000000
#define NRMAX 80000
#define MOD 9973

long long putere( long long a, int n ) {
  long long p = 1;
  while ( n ) {
    if ( n & 1 )
      p *= a;
    a *= a;
    n >>= 1;
  }
  return p;
}

char ciur[MAX + 1];
int prime[NRMAX], nr;
int main() {
  FILE *fin, *fout;
  fin = fopen( "ssnd.in", "r" );
  fout = fopen( "ssnd.out", "w" );
  int d, i, t, n, p;
  ciur[1] = 1;
  for ( d = 2; d * d <= MAX; d++ )
    if ( ciur[d] == 0 ) {
      prime[nr++] = d;
      for ( i = d * d; i <= MAX; i += d )
        ciur[i] = 1;
    }
  for ( i = 2; i < MAX; i++ )
    if ( ciur[i] == 0 )
      prime[nr++] = i;
  fscanf( fin, "%d", &t );
  int nrdiv, suma;
  while ( t-- ) {
    fscanf( fin, "%d", &n );
    i = 0;
    nrdiv = 1;
    suma = 1;
    while ( prime[i] * prime[i] <= n ) {
      p = 0;
      while ( n % prime[i] == 0 ) {
        p++;
        n /= prime[i];
      }
      nrdiv *= p + 1;
      suma = ( 1LL * suma * ( ( putere( prime[i], p + 1 ) - 1) / ( prime[i] - 1 ) ) ) % MOD;
      i++;
    }
    if ( n != 1 ) {
      nrdiv *= 2;
      suma = ( 1LL * suma * ( n * n - 1 ) / ( n - 1 ) ) % MOD;
    }
    fprintf( fout, "%d %d\n", nrdiv, suma );
  }
  fclose( fin );
  fclose( fout );
    return 0;
}