Cod sursa(job #2931089)

Utilizator TheAndreiEnache Andrei Alexandru TheAndrei Data 30 octombrie 2022 14:27:16
Problema Suma divizorilor Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.24 kb
#include <iostream>
#include <fstream>

#define MOD 9901

using namespace std;

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

int prime[1001], fact[1001], noPrime=1, nr=3, bonusFact=0, s=1;
bool isPrime;

int pow(int nr, int p){
  int s=1;
  while(p){
    s=s*nr%MOD;
    p--;
  }
  return s;
}

int invMod(int nr) {
  return pow(nr, MOD - 2);
}

void primegen(){
  prime[1]=2;
  while(noPrime!=1000){
    isPrime=true;
    for(int i=1;i<=noPrime;i++){
        if(nr%prime[i]==0){
          isPrime=false;
          break;
        }
    }
    if(isPrime){
      noPrime++;
      prime[noPrime]=nr;
    }
    nr+=2;
  }
}

void primefact(int a){
  for(int i=1;i<1000&&prime[i]*prime[i]<=a;i++){
    if(a%prime[i]==0){
      while(a%prime[i]==0){
          a/=prime[i];
          fact[i]++;
      }
    }
  }
  if(a!=1){
    bonusFact=a;
  }
}

int main()
{
    int a, b;
    fin>>a>>b;
    primegen();
    primefact(a);

    for(int i=1;i<1000;i++){
      if(fact[i]!=0){
        fact[i]*=b;
        s*=((pow(prime[i], fact[i]+1)-1)*invMod(prime[i]-1))%MOD;
      }
    }
    if(bonusFact)
      s*=(pow(bonusFact, b+1)-1)*invMod(bonusFact-1)%MOD;


    fout<<s;
    return 0;
}