Cod sursa(job #1861196)

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

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

bitset<200000> ciur;
int primes[200000], nprimes;

long long  const mod = 9973;

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

void calculciur() {
  primes[0] = 2;
  nprimes = 1;
  for(int i = 3; i <= 200000; i += 2) {
    if(ciur[i] == 0) {
      primes[nprimes] = i;
      nprimes++;
      if(1LL * i * i <= 200000) { //mare atentie la buffer overflow la ciur
        int j = i * i;
        while (j <= 200000) {
          ciur[j] = 1;
          j += 2*i; //%
        }
      }
    }
  }
}

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 = 0;
  while(i < nprimes && primes[i] * primes[i] <= n) {
    if(n % primes[i] == 0){
      factor[nfactor] = primes[i];
      factorp[nfactor] = 0;
      while(n % primes[i] == 0){
        n /= primes[i];
        factorp[nfactor]++;
      }
      nfactor++;
    }
    i++;
  }
  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;
    calculciur();
    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;
}