Cod sursa(job #2516555)

Utilizator Rares31100Popa Rares Rares31100 Data 1 ianuarie 2020 15:14:49
Problema Suma si numarul divizorilor Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.46 kb
#include <bits/stdc++.h>
#define Mod 9973

using namespace std;

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

int t;

bitset <100001> ciur;
int prim[30001],nrP;

long long n;
int fact[1001],numFact[1001],nr;
long long nrDiv,sumDiv;

void findPrimes(int x)
{
    for(int i=2;i<=x;i++)
        if(!ciur[i])
        {
            prim[++nrP]=i;

            for(int j=i*2;j<=x;j+=i)
                ciur[j]=1;
        }
}

void div_fact(long long x)
{
    nr=0;

    int xMax=sqrt(x);

    for(int d=1;prim[d]<=xMax && x!=1;d++)
        if(x%prim[d]==0)
        {
            fact[++nr]=prim[d];
            numFact[nr]=0;

            while(x%prim[d]==0)
            {
                numFact[nr]++;
                x/=prim[d];
            }
        }

    if(x!=1)
    {
        fact[++nr]=x;
        numFact[nr]=1;
    }
}

long long put(int x,int p)
{
    long long s=1,exp=x;

    while(p)
    {
        if(p%2)
            s*=exp;

        p/=2;
        exp*=exp;
    }

    return s;
}

int main()
{
    in>>t;

    findPrimes(100000);

    while(t--)
    {
        in>>n;
        div_fact(n);

        nrDiv=1;
        sumDiv=1;

        for(int i=1;i<=nr;i++)
            nrDiv*=(numFact[i]+1);

        for(int i=1;i<=nr;i++)
            sumDiv=(long long)(sumDiv *( ( put(fact[i],numFact[i]+1)-1 )/(fact[i]-1) ) )%Mod;

        out<<nrDiv<<' '<<sumDiv<<'\n';
    }

    return 0;
}