Cod sursa(job #2187119)

Utilizator NeredesinI am not real Neredesin Data 26 martie 2018 11:17:36
Problema Suma divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
#include<fstream>
#include<iostream>

using namespace std;

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

const int NMAX = 1e4 + 100;
const int MOD = 9901;

int a,b;
int v[NMAX], prime[NMAX], no, f;
int res = 1;

int lgput(int a,int b)
{
  int c, p, f = 1;
  while(b != 0) {
    p = 1;
    c = a;
    while(1) {
      if(2 * p > b)
        break;
      p = 2 * p;
      c = (c * c) % MOD;
    }
    b -= p;
    f = (f * c) % MOD;
  }
  return f;
}

int main()
{
  in >> a >> b;
  if(a == 0) {
    out << "0\n";
    return 0;
  }

  for(int i = 2; i < NMAX; i++) {
    if(v[i] == 0) {
      no++;
      prime[no]=i;
      for(int j = 2 * i; j < NMAX; j += i)
        v[j]=1;
    }
  }

  for(int i = 1; prime[i] * prime[i] <= a && i <= no; i++) {
    if(a % prime[i] == 0) {
      f = 0;
      while(a % prime[i] == 0) {
        f++;
        a /= prime[i];
      }
      f = f * b;
      if(prime[i] == MOD)
        continue;
      res = (res * ((lgput(prime[i] % MOD, f + 1) - 1 + MOD) % MOD)) % MOD;
      res = (res * lgput((prime[i] % MOD - 1 + MOD) % MOD, MOD - 2)) % MOD;
    }
  }

  if(a != 1) {
    if(a % MOD == 1)
      res = (res * (b + 1)) % MOD;
    else {
      f = b;
      res = (res * ((lgput(a % MOD, f + 1) - 1 + MOD) % MOD)) % MOD;
      res = (res * lgput((a - 1 + MOD) % MOD, MOD - 2)) % MOD;
    }
  }

  out << res << '\n';

  in.close();
  out.close();
  return 0;
}