Cod sursa(job #1850985)

Utilizator AlexandruLuchianov1Alex Luchianov AlexandruLuchianov1 Data 19 ianuarie 2017 08:58:24
Problema Suma si numarul divizorilor Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
#include <iostream>
#include <fstream>
#include <bitset>

using namespace std;
ifstream in ("ssnd.in");
ofstream out ("ssnd.out");

int const mod = 9973;

int nfactor = 0, factorp[1001];
long long  factor[1001];

int power(int a ,int b){
  if(b == 0)
    return 1;
  else if(b == 1)
    return a;
  else if((b & 1) == 0){
    int result = power(a, b >> 1);
    return (result * result) % mod;
  } else{
    int result = power(a, b >> 1);
    return (((result * result) % mod) * a) % mod;
  }
}
void descompunere(long long  n){
  int i = 2;
  if(n % 2 == 0){
    factor[nfactor] = 2;
    factorp[nfactor]= 0;
    while(n % 2 == 0){
      factorp[nfactor]++;
      n /= 2;
    }
    nfactor++;
  }
  i = 3;
  while(i * i <= n){
    if(n % i == 0){
      factor[nfactor] = i;
      factorp[nfactor]= 0;
      while(n % i == 0){
        factorp[nfactor]++;
        n /= i;
      }
      nfactor++;
    }
    i += 2;
  }
  if(1 < n){
    factor[nfactor] = n;
    factorp[nfactor] = 1;
    nfactor++;
  }
}
void div(){
  long long  sd = 1 ,p = 1,nr1 ,nr2;
  int i;
  for(i = 0 ; i < nfactor ; i++){
    p = p * (factorp[i] + 1);
    nr1 = power(factor[i], factorp[i] + 1) + mod - 1;
    nr2 = power(factor[i] - 1, mod - 2);
    sd = (((sd * nr1) % mod) * nr2 )% mod;
  }
  out<<p<<" "<<sd<<'\n';
}
int main()
{
    long long n ,a ;
    int i;
    in>>n;
    for(i = 0 ; i < n ;i++){
      in>>a;
      nfactor = 0;
      descompunere(a);
      div();
    }
    return 0;
}