Cod sursa(job #3210066)

Utilizator AlexRzvAlex Razvan AlexRzv Data 4 martie 2024 17:45:29
Problema Suma si numarul divizorilor Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.67 kb
#include <bits/stdc++.h>
using namespace std;

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

int n, x;
int f[1000001], prime[100001];
int nrprime;
int v[10000];

const int MOD = 9973;

void eratostene(){
    f[0] = f[1] = 1;
    for(int i = 2;i * i <= 1000000;++i)
        if(!f[i])
            for(int j = 2;i * j <= 1000000;++j)
                f[i * j] = 1;
    for(int i = 1;i<=1000000;++i)
        if(f[i] == 0)
            prime[++nrprime] = i;
}

long long putere(long long nr, long long put){
    nr%=MOD;
    if(nr == 0)
        return 0;
    long long rez = 1;
    while(put){
        if(put % 2 == 1){
            rez *= nr;
            rez %= MOD;
            put--;
        }
        nr *= nr;
        nr %= MOD;
        put /= 2;
    }
    return rez;
}   

void suma_si_nr_div(int nr){
    int nrdiv = 1;
    long long sumdiv = 1;
    int ind  = 1;
    while(1LL * prime[ind] * prime[ind] <= nr){
        if(nr % prime[ind]){
            ind++;
            continue;
        }   
        int p = 0;
        while(nr % prime[ind] == 0)
            nr /= prime[ind], p++;
        nrdiv *= (p + 1);
        long long p1 = (putere(prime[ind],p + 1) - 1) % MOD;
        long long p2 = putere(prime[ind] - 1, MOD - 2) % MOD;
        sumdiv = (((sumdiv * p1) % MOD) * p2) % MOD;
        ind++;
    }
    if(nr > 1){
        nrdiv *= 2;
        sumdiv = ((1LL * sumdiv * (nr + 1)) % MOD);
    }
    fout << nrdiv << ' ' << sumdiv << '\n';
}

int main(){

    fin >> n;
    for(int i = 1;i<=n;++i)
        fin >> v[i];
    eratostene();
    for(int i = 1;i<=n;++i){
        suma_si_nr_div(v[i]);
    }
    return 0;
}