Cod sursa(job #1854135)

Utilizator AlexandruLuchianov1Alex Luchianov AlexandruLuchianov1 Data 22 ianuarie 2017 13:57:29
Problema Suma divizorilor Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.93 kb
#include <iostream>
#include <fstream>
#include <bitset>

using namespace std;
ifstream in ("sumdiv.in");
ofstream out ("sumdiv.out");
int const radmax = 8000;
int const modulo = 9901;

bitset<radmax> ciur;
int primes[radmax], nprimes;
int a, b;


void computeciur() {
  primes[0] = 2;
  nprimes = 1;
  for(int i = 3; i <= radmax; i += 2) {
    if(ciur[i] == 0) {
      primes[nprimes] = i;
      nprimes++;
      if(1LL * i * i <= radmax) {
        int j = i * i;
        while (j<=radmax) {
          ciur[j] = 1;
          j += 2*i;
        }
      }
    }
  }
}

void gcd(int &x ,int &y ,int a ,int b){
  if(b == 0){
    x = 1;
    y = 0;
  } else{
    gcd(x ,y ,b , a % b);
    int aux = x;
    x = y;
    y = aux - a / b * y;
  }
}

int logpow(int x, int y) {
  if(y == 0)
    return 1;
  else {

    int result = logpow(x, y >> 1);
    if((y & 1) == 0)
      return (result * result) % modulo;
    else
      return ((result * result) % modulo * x) % modulo;
  }
}



void updatesumformula(int &sumadiv, int p, int d) {
  if((p - 1) % modulo == 0){
    sumadiv = (sumadiv * (d + 1)) % modulo;
  } else{
    sumadiv = (sumadiv * (logpow(p % modulo, d + 1) + modulo - 1)) % modulo;

    int x ,y;
    gcd(x ,y ,p - 1 , modulo);

    if(x < 0){
      x = modulo + x % modulo;
    }
    sumadiv = (sumadiv * x) % modulo;
  }
}

void descompunere(int n) {
  int sumadiv = 1;

  int i = 0;
  while(i < nprimes && primes[i] * primes[i] <= n) {
    if(n % primes[i] == 0){
      int npow = 0;
      while(n % primes[i] == 0){
        n /= primes[i];
        npow++;
      }
      npow *= b;
      updatesumformula(sumadiv, primes[i], npow);
    }
    i++;
  }
  if(1<n) {
    updatesumformula(sumadiv, n % modulo, b);
  }
  out<<sumadiv % modulo;
}

int main() {
  computeciur();
  in>>a>>b;
  if(a == 0)
    out<<0;
  else{
    descompunere(a);
  }
  return 0;
}