Cod sursa(job #2230436)

Utilizator nicolaefilatNicolae Filat nicolaefilat Data 10 august 2018 10:22:41
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include <iostream>
#include <fstream>
#define MOD 9973
#define MAXN 1000001

using namespace std;

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

int nr_diviz,suma,v[MAXN],cnt;

void ciur(){
    for(int i = 2; i < MAXN; i++)
        v[i] = 1;
    for(int i = 2; i < MAXN; i++){
        if(v[i]){
            v[cnt++] = i;
            for(int j = i + i; j < MAXN; j+= i)
                v[j] = 1;
        }
    }
}
int put(int a,int b){
    int rez = 1;
    while(b){
        if(b % 2 == 0){
            a = (a % MOD * a % MOD) % MOD;
            b /= 2;
        }else{
            b--;
            rez = (a % MOD * rez % MOD) % MOD;
        }
    }
    return rez;
}

void rez(long long int n){
    int i = 0,exp,d = v[i];
    nr_diviz = 1,suma = 1;

    while(d * d <= n){
        exp = 0;

        while(n % d == 0){
            n /= d;
            exp++;
        }
        if(exp > 0){
            nr_diviz *= (exp + 1);
            int aux = (put(d,exp + 1) - 1)/(d - 1);
            suma = (suma % MOD * aux % MOD) % MOD;
        }
        d = v[i++];

    }
    if(n > 1){
        nr_diviz *= 2;
        int aux = (n*n - 1)/(n - 1);
        suma = (suma % MOD * aux % MOD) % MOD;
    }

}


int main()
{
    int t;
    in>>t;

    ciur();

    for(int i = 0; i < t; i++){
        long long nr;
        in>>nr;
        rez(nr);
        out<<nr_diviz<<" "<<suma<<"\n";
    }
    return 0;
}