Cod sursa(job #2666994)

Utilizator TghicaGhica Tudor Tghica Data 2 noiembrie 2020 18:53:57
Problema Suma divizorilor Scor 100
Compilator c-64 Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <stdio.h>

#define MOD 9901

int lgput( int a, int b ) {
  int put = 1;
  while ( b > 0 ) {
      if ( b % 2 == 1 )
          put = (long long)put * a % MOD;
      a = (long long)a * a % MOD;
      b /= 2;
  }
  return put;
}

int main() {
  FILE *fin, *fout;
  fin = fopen( "sumdiv.in", "r" );
  fout = fopen( "sumdiv.out", "w" );
  int a, n, e, d, var, imp, rez;
  fscanf( fin, "%d %d", &a, &n );
  if( n == 0 )
    a = 1;
  d = 2;
  rez = 1;
  while (d * d <= a) {
    e = 0;
    while(a % d == 0) {
      e++;
      a /= d;
    }
    if( e ) {
      if ( d % MOD == 1 ) {
        rez = ( (long long)rez * ( e * n + 1 ) ) % MOD;
      } else {
      e *= n;
      e++;
      var = lgput( d, e );
      if( var % MOD == 0 )
        var = MOD - 1;
      else
        var--;
      imp = lgput( d - 1, MOD - 2 );
      rez = (long long)rez * var * imp % MOD;
      }
    }
    ++d;
  }
  if( a > 1 ) {
    if ( a % MOD == 1 ) {
      rez = ( (long long)rez * (n + 1) ) % MOD;
    } else {
      e = 1;
      e *= n;
      e++;
      var = lgput( a, e );
      if( var % MOD == 0 )
        var = MOD - 1;
      else
        var--;
      imp = lgput( a - 1, MOD - 2 );
      rez = (long long)rez * var * imp % MOD;
    }
  }
  fprintf( fout, "%d", rez );
  return 0;
}