Cod sursa(job #3002057)

Utilizator MerlinTheWizardMelvin Abibula MerlinTheWizard Data 14 martie 2023 12:04:21
Problema Suma si numarul divizorilor Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.51 kb
#include<iostream>
#include<fstream>
#include<vector>
using namespace std;

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

long long n;
bool ci[1000005];
vector<int> primes;

void ciur()
{
    if(n>1)
        primes.push_back(2);
    for(int i=3;i<=1000000;i = i + 2)
    {
        if(ci[i] == false)
        {
            for(int j=i*2;j<=1000000;j = j + i)
            {
                ci[j] = true;
            }   
            primes.push_back(i);
        }
    }
}

long long ridput(long long baza,long long putere)
{
    long long aux = 1;
    while(putere)
    {
        if(putere%2 == 0)
        {
            baza = ((baza % 9973) * (baza % 9973)) % 9973;
            putere /= 2;
        }
        else if(putere%2 == 1)
        {
            putere--;
            aux = ((aux % 9973) * (baza % 9973)) % 9973;
        }
    }
    return aux;
}

void descfact(long long x)
{
    long long suma = 1,cardinal = 1;
    for(int i=0;i<primes.size() && x > 1;i++)
    {
        int cnt = 0;
        while(x%primes[i] == 0)
        {
            cnt++;
            x = x / primes[i];
        }
        cardinal = cardinal * (cnt+1);
        long long x = (ridput(primes[i],(cnt+1))-1) % 9973;
        long long y = primes[i]-1;
        if(x == -1)
            x = 9972;
        suma = (suma * (x/y))%9973;
    }
    g<<cardinal<<" "<<suma<<"\n";
}

int main()
{
    f>>n;
    ciur();
    while(n--)
    {
        long long x;
        f>>x;
        descfact(x);
    }
}