Cod sursa(job #2047703)

Utilizator RaresEGaySopterean Adrian RaresEGay Data 25 octombrie 2017 10:06:16
Problema Suma si numarul divizorilor Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.82 kb
#include <iostream>
#include <math.h>
#include <fstream>

#define maxn 1000000
#define mod 9973

using namespace std;

unsigned long long t, n, divisor, l, prod;
unsigned long long prim[maxn], p[maxn], factor[maxn];

ifstream f("ssnd.in");
ofstream g("ssnd.out");

int Div(int fact, int power){
    int s = 1, a, sol;
    for(int i = 1; i <= power; ++i){
        a = fact, sol = 1;
        for(int j = 0; (1LL<<j) <= i; ++j){
            if((1LL<<j) & i) sol = ((sol % mod) * (a % mod)) % mod;
            a = ((a % mod) * (a % mod)) % mod;
        }
        s = ((s % mod) + (sol % mod)) % mod;
    }
    return s;
}

int main(){

    prim[1] = 1;
    for(int i = 2; i < maxn; ++i){
        if(!prim[i]){
            for(int j = 2*i; j < maxn; j += i) prim[j] = 1;
        }
    }

    f >> t;
    while(t > 0){
        --t; divisor = 1, l = 0, prod = 1;
        f >> n;
        if(prim[n]){
            if(n % 2 == 0){
                factor[++l] = 2;
                while(n % 2 == 0){
                    ++p[l];
                    n /= 2;
                }
            }
            for(int i = 3; i*i <= n; i += 2){
                if(n % i == 0){
                    factor[++l] = i;
                    while(n % i == 0){
                        ++p[l];
                        n /= i;
                    }
                }
            }
            if(n > 1){
                factor[++l] = n;
                ++p[l];
            }
            for(int i = 1; i <= l; ++i)
                divisor *= (p[i] + 1);
            for(int i = 1; i <= l; ++i){
                prod = ((prod % mod) * (Div(factor[i], p[i]) % mod)) % mod;
                p[i] = 0;
            }
            g << divisor << ' ' << prod << '\n';
        }
        else g << 2 << ' ' << n + 1 << '\n';
    }
}