Cod sursa(job #1861170)

Utilizator AlexandruLuchianov1Alex Luchianov AlexandruLuchianov1 Data 28 ianuarie 2017 17:44:10
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.93 kb
#include <iostream>
#include <fstream>
#include <bitset>

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

long long  const mod = 9973;

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

void gcd(long long  a ,long long  b ,long long &x ,long long  &y){
  if(b == 0){
    x = 1;
    y = 0;
  } else{
    gcd(b ,a % b ,x ,y);
    long long  aux = x;
    x = y;
    y = aux - a / b * y;
  }
}
long long power(int a ,int b){
  if(b == 0)
    return 1;
  else if(b == 1)
    return a;
  else if((b & 1) == 0){
    long long result = power(a, b >> 1);
    return (result * result) % mod;
  } else{
    long long 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++;
  }
}
int main()
{
    long long n ,a ,x = 0,y = 0,s ,nr = 0 ,j;
    int i;
    in>>n;
    for(i = 0 ; i < n ;i++){
      in>>a;
      nfactor = 0;
      descompunere(a);
      s = 1;
      nr = 1;
      for(j = 0 ; j < nfactor ; j++){
        nr *= (factorp[j] + 1);
        if((factor[j] - 1) % mod == 0){
          s = (s * (factorp[j] + 1)) % mod;
        } else{

          s = (s * (power(factor[j] % mod, factorp[j] + 1) + mod - 1)) % mod;
          gcd(factor[j] - 1 ,mod ,x ,y);

          if(x < 0){
            x = mod + x % mod;
          }
          s = (s * x) % mod;
        }
      }
      out<<nr<<" "<<s<<'\n';
    }
    return 0;
}