Cod sursa(job #2146286)

Utilizator KernelovicNegrean Victor Kernelovic Data 27 februarie 2018 21:51:19
Problema Suma si numarul divizorilor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 kb
#include <iostream>
#include <bitset>
#include <cmath>
#include <cstdio>
#define MOD 9973
 
using namespace std;
 
bitset<1000001> bitset1;
int sir_p[100001], aux;
 
int myPow(int n, int p)
{
    long long a = n, sol = 1;
 
    for (unsigned int i = 0; (1 << i) <= p; i++)
    {
        if (((1 << i) & p) > 0)
        {
            sol = 1LL * (sol * a) % MOD;
        }
 
        a = (a * a) % MOD;
    }
    return sol;
}
 
int nr_div(int nr)
{
    int t, produs = 1, suma = 1;
 
    for(int i = 0; i < aux && nr; i++)
    {
        t = 0;
        while(nr % sir_p[i] == 0)
        {
            t++;
            nr /= sir_p[i];
        }
 
        produs *= t + 1;
        suma *= (myPow(sir_p[i], t + 1) - 1) / (sir_p[i] - 1);
    }
 
    if(nr != 1)
    {
        produs *= 2;
        suma *= (myPow(nr, 2) - 1) / (nr - 1);
    }
 
    cout << produs << " ";
 
    return suma % MOD;
}
 
void ciur(int nr)
{
    int root = sqrt(nr) + 1;
    for(int i = 2; i <= root; i++)
    {
        if(bitset1[i]) continue;
 
        for(int j = i * i; j <= root; j += i)
        {
            bitset1[j] = 1;
        }
 
        sir_p[aux] = i;
        aux++;
    }
}
 
int main()
{
    freopen("ssnd.in", "r", stdin);
    freopen("ssnd.out", "w", stdout);
 
    int n; cin >> n;
    int biggest = 0, sir[n];
 
    for(int i = 0; i < n; i++)
    {
        cin >> sir[i];
 
        if(biggest < sir[i]) biggest = sir[i];
    }
 
    ciur(biggest);
 
    for(int i = 0; i < n; i++)
    {
        cout << nr_div(sir[i]) << endl;
    }
}