Cod sursa(job #2722651)

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

const int NMAX=1e6+5;

const int MOD=9973;

long long n;

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

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

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



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