Cod sursa(job #2980887)

Utilizator sLinXDinca Robert sLinX Data 16 februarie 2023 21:32:41
Problema Suma si numarul divizorilor Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.7 kb
#include <iostream>
#include <fstream>
#include <utility>
#include <cmath>

using namespace std ;

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

int n[1005], t, s;

unsigned long long int cnt, sum;

bool v[1000010];

int p[80500];

void Ciur(int nr)
{
    for(unsigned long long int i = 3; i*i <= nr; i+=2)
        if(v[i] == true)continue;
        else
            {
                for(unsigned long long int j = i*i ; j<= nr; j+=i)
                   v[j]=1;
            }
    p[1] = 2;
    cnt = 2;
    for(int  i = 3; i*i <= nr ; i+=2)if(!v[i])p[cnt] = i,cnt++;


}

void Solve(int nr)
{
    cnt = 1 ; sum =  1;
    for(int i = 1; p[i] != 0; i++)
    {
        unsigned long long int currCnt = 1;unsigned long long int currSum = 1; unsigned long long int powerCurrPrime = 1;
        unsigned long long int value = nr;
        if( p[i] * p[i] > nr)break;
        else
            {
                while(nr % p[i] == 0)
                {
                    nr /= p[i];
                    value /= p[i];
                    currCnt++;
                    powerCurrPrime = (powerCurrPrime * p[i])%9973;
                    currSum  = (currSum + powerCurrPrime) % 9973;


                }
                cnt = (cnt*currCnt)%9973;
                sum = (sum * currSum) % 9973;


            }


    }
    if( nr > 1){
                    cnt *=2;
                    sum = (sum *(1+nr))%9973;
                }

    fout << cnt % 9973 << ' ' << sum << '\n';
}


int main()
{
    fin >> t;
    for(int i = 1; i <= t; i++)
        {fin>>n[i];if(n[i] > s)s = n[i];}
    Ciur(s);
    for(int  i= 1; i<=t ; i++)
        Solve(n[i]);
    return 0;
}