Cod sursa(job #2663869)

Utilizator mihaipriboimihailucapriboi mihaipriboi Data 27 octombrie 2020 15:29:21
Problema Suma divizorilor Scor 70
Compilator c-64 Status done
Runda Arhiva de probleme Marime 1.59 kb
//Mihai Priboi

#include <stdio.h>
#include <stdlib.h>
#define MOD 9901
#define RAD_A 7080 // 7079 cel mai mic numar prim mai mare decat radical de max a

int r, x, y;
int ciur[RAD_A], nrprime[RAD_A];

void euclid( int a, int b, int *r, int *x, int *y ) {
  int x0, y0;
  if( b == 0 ) {
    *r = a;
    *x = 1;
    *y = 0;
  }
  else {
    euclid( b, a % b, r, &x0, &y0 );
    *x = y0;
    *y = x0 - (a / b) * y0;
  }
}

long long pow( long long n, long long p ) {
  long long r;
  r = 1;
  while( p > 0 ) {
    if( p % 2 == 1 )
        r = (r * n) % MOD;
    n = (n * n) % MOD;
    p /= 2;
  }
  return r;
}

int main() {
  FILE *fin, *fout;
  int a, b, d, p, m, n, rez, d1, x1, y1, i;
  // precalculare nr prime
  for( d = 2; d < RAD_A; d++ )
    if( !ciur[d] )
      for( i = d * d; i < RAD_A; i += d )
        ciur[i] = 1;
  //
  i = 0;
  d = 0;
  for( d = 2; d < RAD_A; d++ )
    if( !ciur[d] )
      nrprime[i++] = d;
  //
  fin = fopen( "sumdiv.in", "r" );
  fscanf( fin, "%d%d", &a, &b );
  fclose( fin );
  d = 0;
  n = m = 1;
  while( nrprime[d] * nrprime[d] <= a ) {
    p = 0;
    while( a % nrprime[d] == 0 ) {
      a /= nrprime[d];
      p++;
    }
    if( p > 0 ) {
      p *= b;
      n = (n * (pow(nrprime[d], p + 1) - 1)) % MOD;
      m = (m * (nrprime[d] - 1)) % MOD;
    }
    d++;
  }
  if( a > 1 ) {
    p = b;
    n = (n * (pow(a, p + 1) - 1)) % MOD;
    m = (m * (a - 1)) % MOD;
  }
  euclid(m, MOD, &d1, &x1, &y1);
  if( x1 <= 0 )
    x1 = MOD + x1 % MOD;
  rez = (n * (x1 % MOD)) % MOD;
  fout = fopen( "sumdiv.out", "w" );
  fprintf( fout, "%d", rez );
  fclose( fout );
  return 0;
}