Cod sursa(job #2664509)

Utilizator Antonia_onisoruantonia onisoru Antonia_onisoru Data 28 octombrie 2020 18:59:14
Problema Suma divizorilor Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream in("sumdiv.in");
ofstream out("sumdiv.out");

const int MODX = 9901;

int putere( int p, int n ){
  int nr = 1;
  while( p > 0 ){
    if( p % 2 == 1 )
      nr = ( nr * n ) % MODX;
    n = ( n * n ) % MODX;
    p = p / 2;
  }
  return nr;
}

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

int main()
{
    int a, b, div, e, sum1, sum2, x, y, d, i, j, sum;
    in>>a>>b;
    div = 2;
    sum1 = 1;
    sum2 = 1;
    while( div * div <= a ){
      e = 0;
      while( a % div == 0 ){
        e++;
        a = a / div;
      }
      if( e > 0 ){
        e = e * b + 1;
        i = putere( e, div ) - 1;
        j = div - 1;
        sum1 = ( sum1 * i ) % MODX;
        sum2 = ( sum2 * j ) % MODX;
      }
      div++;
    }
    if( a > 0 ){
      i = putere( b + 1, a ) - 1;
      j = a - 1;
      sum1 = ( sum1 * i ) % MODX;
      sum2 = ( sum2 * j ) % MODX;
    }
    euclid( sum2, MODX, &d, &x, &y );
    if( x < 0 )
      x = MODX + x % MODX;
    sum = ( sum1 * x ) % MODX;
    out<<sum;
    return 0;
}