Cod sursa(job #2047732)

Utilizator RaresEGaySopterean Adrian RaresEGay Data 25 octombrie 2017 10:38:24
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.7 kb
#include <iostream>
#include <math.h>
#include <vector>
#include <fstream>

#define maxn 1000000
#define mod 9973

using namespace std;

unsigned long long n;
int t, divisor, l, prod;
int prim[maxn], p[maxn/100], factor[maxn/100];
vector < int > v;

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; (1<<j) <= i; ++j){
            if((1<<j) & i) sol = ((sol % mod) * (a % mod)) % mod;
            a = ((a % mod) * (a % mod)) % mod;
        }
        s = ((s % mod) + (sol % mod)) % mod;
    }
    return s;
}

int main(){

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

    f >> t;
     while(t > 0){
        --t; divisor = 1, l = 0, prod = 1;
        f >> n;
        if(n % 2 == 0){
            factor[++l] = 2;
            while(n % 2 == 0){
                ++p[l];
                n /= 2;
            }
        }
        for(int i = 1; v[i] <= sqrt(n); ++i){
            if(n % v[i] == 0){
                factor[++l] = v[i];
                while(n % v[i] == 0){
                    ++p[l];
                    n /= v[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';
    }
}