Cod sursa(job #1267447)

Utilizator vlad.ulmeanu30Ulmeanu Vlad vlad.ulmeanu30 Data 19 noiembrie 2014 21:44:38
Problema Suma si numarul divizorilor Scor 60
Compilator c Status done
Runda Arhiva educationala Marime 1.51 kb
#include <stdio.h>

#define NEPRIM 1
#define PRIM 0

#define MAXN 1000000

typedef struct divs {
  int p;
  int a;
}num;

num v[1000];
char chur[1000000];

int putereLOG ( int baz, int exp ) {
  int rez = 1;
  while ( exp > 0 ) rez *= baz, exp --;
  return rez;
}

void ciur ( long long n ) {
  int i, j; chur[0] = chur[1] = NEPRIM;
  for ( i = 2; i * i <= n; i ++ )
    if ( chur[i] == PRIM )
      for ( j = i + i; j <= n; j += i )
        chur[j] = NEPRIM;
}

int dfp ( long long n ) {
  int d = 2, div, i = 0;

  while ( n > 1 && d * d <= n ) {
    div = 0;
    while ( n % d == 0 ) {
      div ++;
      n /= d;
    }

    if ( div > 0 ) {
      v[i].p = d;
      v[i].a = div;
      i ++;
    }

    d ++;
    while ( n > 1 && chur[d] == NEPRIM && d * d <= n )
      d ++;
  }

  if ( n > 1 ) {
    v[i].p = n;
    v[i].a = 1;
    i ++;
  }

  return i;
}

int main () {
  FILE *f, *g;

  f = fopen( "ssnd.in", "r" );
  g = fopen( "ssnd.out", "w" );

  int t;

  fscanf( f, "%d", &t);

  ciur ( MAXN );

  int i, j, prod, var;
  long long n;

  for ( i = 0; i < t; i++ ) {
    fscanf( f, "%lld", &n );
    var = dfp ( n );
    for ( j = 0, prod = 1; j < var; j++ )
      prod *= ( v[j].a + 1 );

    fprintf( g, "%d ", prod );

    for ( j = 0, prod = 1; j < var; j++ )
      prod = ( prod * ( ( putereLOG( v[j].p, v[j].a + 1 ) - 1 ) / ( v[j].p - 1 ) ) ) % 9973 ;

    fprintf( g, "%d\n", prod );
  }

  fclose ( f );
  fclose ( g );

  return 0;
}