Cod sursa(job #3038177)

Utilizator AndreiMLCChesauan Andrei AndreiMLC Data 26 martie 2023 22:09:04
Problema Suma si numarul divizorilor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.78 kb
#include <iostream>
#include <fstream>
#define mod 9973
#include <vector>
#define maxi 10000005
using namespace std;

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

int t;
long long n;
vector<int>prime;
long long ciur[maxi];
void fa_ciur()
{
    ciur[0] = ciur[1] = 1;
    for (int i = 2; i <= 10e6;i++)
    {
        if (ciur[i] == 0)
        {
            prime.push_back(i);
            for (int j = i + i; j <= 10e6; j+=i)
            {
                ciur[j] = 1;
            }
        }
    }
}
long long diviz(long long a)
{
    long long tot = 1;
    long long ind = 0;
    while (a > 1)
    {
        long long op = 0;
        while (a % prime[ind] == 0)
        {
            a /= prime[ind];
            op++;
        }
        if (op > 0)
        {
            tot = tot * (op + 1);
        }
        ind++;
    }
    return tot;
}

long long expo(long long a, long long b)
{
    if (b == 0)
    {
        return 1;
    }
    else if (b % 2 == 1)
    {
        long long x = expo(a, b / 2) ;
        return a * x * x;
    }
    long long x = expo(a, b / 2);
    return x * x;
}

long long totsum(long long a)
{
    long long retur = 1;
    long long ind = 0;
    while (a > 1)
    {
        long long op = 0;
        while (a % prime[ind] == 0)
        {
            a /= prime[ind];
            op++;
        }
        if (op > 0)
        {
            retur = (retur * ((expo(prime[ind],op+1) - 1) / (prime[ind]-1))) % mod;
        }
        ind++;
    }
    return retur;
}
int main()
{
    f >> t;
    fa_ciur();
    for (int i = 1; i <= t; i++)
    {
        f >> n;
        long long totdiv = diviz(n);
        g << totdiv << ' ';
        long long sum = totsum(n);
        g << sum << '\n';
    }
}