Cod sursa(job #2623597)

Utilizator euyoTukanul euyo Data 3 iunie 2020 14:45:41
Problema Suma si numarul divizorilor Scor 70
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.45 kb
#include <stdio.h>	
#define MOD 9973
#define MAX 1000000
#define MAXP 79000
	
 
char ciur[MAX + 1];	
int p[MAXP];
	
int explg( int a, int n ) {
  int pow;
	
  pow = 1;
  while ( n > 0 ) {
    if ( n & 1 ) {
      pow = (pow * a) % MOD;
    }
    a = (a * a) % MOD;
    n >>= 1;
  }
  return pow;	
}
	

int main() {	
  FILE *fin = fopen( "ssnd.in", "r" );
  FILE *fout = fopen( "ssnd.out", "w" );
  int q, i, exp, k, d, nrd, maxk, pow, invmod;
  unsigned long long S, n;
 
  k = 0;	
  for ( d = 2; d * d <= MAX; ++d ) {
    if ( ciur[d] == 0 ) {
      p[k++] = d;
      for ( i = d * d; i <= MAX; i += d ) {
        ciur[i] = 1;
      }
    }
  }
  for ( ; d <= MAX; ++d ) {	
    if ( ciur[d] == 0 ) {
      p[k++] = d;
    }
  }
  maxk = k;	
  fscanf( fin, "%d", &q );
  for ( i = 0; i < q; ++i ) {
    fscanf( fin, "%lld", &n );
    nrd = 1;
    S = 1;
    k = 0;
    while ( 1LL * p[k] * p[k] <= n && maxk > k ) {
      exp = 0;
      while ( n % p[k] == 0 ) {
        ++exp;
        n /= p[k];
      }
      if ( exp > 0 ) {
        ++exp;
        pow = explg( p[k] % MOD, exp );
        invmod = explg( (p[k] - 1) % MOD, MOD - 2 );
        S = (S * (((pow % MOD - 1) * invmod) % MOD)) % MOD;
        nrd *= exp;
      }
      ++k;
    }
    if ( n > 1 ) {
      nrd *= 2;
      invmod = explg( (n - 1) % MOD, MOD - 2 );
      S = (S * ((((n % MOD) * n - 1) * invmod)) % MOD) % MOD;
    }
    fprintf( fout, "%d %llu\n", nrd, S );
  }
  fclose( fin );	
  fclose( fout );
  return 0;
}