Cod sursa(job #2722650)

Utilizator AlexMariMarinescu Alexandru AlexMari Data 13 martie 2021 09:32:10
Problema Suma si numarul divizorilor Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.43 kb
#include<bits/stdc++.h>
using namespace std;
ifstream fin("ssnd.in");
ofstream fout("ssnd.out");

const long long NMAX=1e6+5;

const long long MOD=9973;

long long n,w[1000005],prime[1000005],k,nrdiv=1,sumdiv=1;

void ciur()
{
    prime[0]=prime[1]=1;
    for(long long i=2; i*i<=NMAX; i++)
        if(prime[i]==0)
        {
            w[++k]=i;
            for(long long j=i+i; j<=NMAX; j+=i)
                prime[j]=1;
        }
}

long long lgput(long long base,long long exp)
{
    long long aux=base,ans=1;
    for(long long i=1; i<=exp; i*=2)
    {
        if(i&exp)
            ans=(ans*aux)%MOD;
        aux=(aux*aux)%MOD;
    }
    return ans;
}



int main()
{
    long long t;
    fin>>t;
    ciur();
    while(t--)
    {
        fin>>n;
        nrdiv=1;
        sumdiv=1;
        for(long long i=1; i<=k&&w[i]*w[i]<=n; i++)
        {
            long long val=w[i],e=0;
            while(n%val==0)
            {
                n=n/val;
                e++;
            }
            nrdiv*=(e+1);
            if(e!=0)
            {
                long long nr1=(lgput(val,e+1)-1)%MOD;
                long long nr2=lgput(val-1,MOD-2)%MOD;
                sumdiv=(((sumdiv*nr1)%MOD)*nr2)%MOD;
            }
        }
        if(n>1)
        {
            nrdiv*=2;
            sumdiv=(sumdiv*(n+1))%MOD;
        }
        fout<<nrdiv<<" "<<sumdiv;
        fout<<'\n';
    }
}