Cod sursa(job #2248247)

Utilizator Cezar211Popoveniuc Cezar Cezar211 Data 29 septembrie 2018 12:00:48
Problema Suma si numarul divizorilor Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <iostream>
#include <fstream>
#include <vector>
#define MOD 9973
#define NM 1000005
using namespace std;
ifstream fin ("ssnd.in");
ofstream fout ("ssnd.out");
inline void ciur();
inline void solve(int x);
int suma_partiala_functie(int f, int p);
vector<int> v;
bool c[NM];
int T, i, j;
unsigned long long x;
int main()
{
    fin >> T;
    ciur();
    for(;T--;)
    {
        fin >> x;
        solve(x);
    }

    return 0;
}

inline void solve(int x)
{
    int k=0, p, nrdiv=1, sumadiv=1;
    while(v[k]*v[k]<=x)
    {
        p=0;
        while(x%v[k]==0)
        {
            p++;
            x/=v[k];
        }
        nrdiv*=(p+1);
        sumadiv*=suma_partiala_functie(v[k], p);
        sumadiv=sumadiv%MOD;
        k++;
    }
    if(x > 1)
    {
        nrdiv*=2;
        sumadiv*=(1+x);
        sumadiv=sumadiv%MOD;
    }

    fout << nrdiv << ' ' << sumadiv << '\n';
}

int suma_partiala_functie(int f, int p)
{
    int s = 1, fact=1;
    for(i=1; i<=p; i++)
    {
        fact*=f;
        s+=fact;
    }
    return s;
}

inline void ciur()
{
    c[0]=c[1]=1;
    for(i=2; i*i<=NM; i++)
        if(c[i] == 0)
            for(j=i; i*j<=NM; j++)
                c[i*j] = 1;
    for(i=2; i<=NM-1; i++)
        if(c[i] == 0)
            v.push_back(i);
}