Cod sursa(job #2479890)

Utilizator MaraPMara P MaraP Data 24 octombrie 2019 17:30:47
Problema Suma si numarul divizorilor Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.31 kb
#include <iostream>
#include <fstream>
#define MAX 1000000
#define MOD 9973
using namespace std;

ifstream fin("ssnd.in");
ofstream fout("ssnd.out");
long long int prime[MAX], k_prime=0;
int ciur[MAX];
long long int number_divisors, sum_divisors;
void generate_ciur()
{
    for(int i=2; i<=MAX; i++)
        if(!ciur[i])
        {
            prime[k_prime++]=i;
            for(int j=i+i; j<=MAX; j+=i)
                ciur[j]=1;
        }
}
long long int ridicare_la_putere(long long int baza, long long int putere)
{
    long long int rezultat=1;
    while(putere)
    {
        if(putere%2==0)
        {
            baza=(baza*baza)%MOD;
            putere/=2;
        }
        else
        {
            putere--;
            rezultat=(rezultat*baza)%MOD;
        }
    }
    return rezultat;
}
long long int cmmdc;
pair<long long int, long long int> euclid_extins(long long int x, long long int y)
{
    if(y==0)
    {
        cmmdc=x;
        return {1,0};
    }
    auto p=euclid_extins(y,x%y);
    return {p.second, p.first-(x/y)*p.second};
}
long long int factor(long long int divizor, long long int putere)
{
    long long int put=ridicare_la_putere(divizor,putere+1)-1;
    if(put<0)
        put+=MOD;
    auto p=euclid_extins(divizor-1,MOD);
    if(p.first<0)
        p.first+=MOD;
    return (put*p.first)%MOD;
}
void descomp(long long int x)
{
    for(int i=0; i<k_prime&&prime[i]*prime[i]<=x; i++)
    {
        long long int prim=prime[i];
        if(x%prim==0)
        {
            long long int putere=0;
            while(x%prim==0)
            {
                x/=prim;
                putere++;
            }
            if(putere)
            {
                number_divisors=(number_divisors*(putere+1))%MOD;
                sum_divisors=(sum_divisors*factor(prim,putere))%MOD;
            }
        }
    }
    if(x!=1)
    {
         number_divisors=(number_divisors*2)%MOD;
         sum_divisors=(sum_divisors*factor(x,1))%MOD;
    }
}
void read()
{
    generate_ciur();
    int t;
    fin>>t;
    for(int i=0;i<t;i++)
    {
        long long int x;
        fin>>x;
        sum_divisors=number_divisors=1;
        descomp(x);
        fout<<number_divisors<<" "<<sum_divisors<<"\n";
    }
}
int main()
{
    read();
    return 0;
}