Cod sursa(job #3332617)

Utilizator IonicaDavidIonica David IonicaDavid Data 8 ianuarie 2026 08:04:32
Problema Suma si numarul divizorilor Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.52 kb
#include <iostream>
#include <fstream>
#include <bitset>
#define maxim 1000003
#define MOD 9973
using namespace std;
int prim[maxim+1],t,k;
long long n;
bitset <maxim+1> viz;
ofstream g("ssnd.out");
void ciurul()
{

    for(int i=2;i<maxim;++i)
        if(viz[i]==0)
    {prim[++k]=i;
        for(int j=2*i;j<maxim;j+=i)
            viz[j]=1;
    }


}

long long exp(long long baza, long long expo)
{
    long long rez=1;
    while(expo!=0)
    {
        if(expo%2==0)
        {
            baza=((baza%MOD)*(baza%MOD))%MOD;
            expo=expo/2;
        }
        else
        {
            rez=((rez%MOD)*(baza%MOD))%MOD;
            --expo;
        }
    }
    return rez%MOD;
}




void solve(long long nr)
{
    long long nd=1,sd=1;

    for(int i=1;i<=k && 1LL*prim[i]*prim[i]<=n;++i)
    {
        if(nr%prim[i]==0)
        {
            int p=0;
            while(nr%prim[i]==0)
            {
                ++p;
                nr/=prim[i];
            }
            nd = 1LL*((nd%MOD)*((p+1)%MOD))%MOD;
            long long p1=(exp(prim[i],p+1)-1)%MOD;
            long long p2=exp(prim[i]-1,MOD-2)%MOD;
            sd=(((sd*p1)%MOD)*p2)%MOD;

        }
    }
    if(nr!=1)
    {
        nd=((nd%MOD)*2)%MOD;
        sd = (1LL*sd*(nr+1) % MOD);
    }
    g<<nd<<' '<<sd<<'\n';
}

int main()
{
   ciurul();
   ifstream f("ssnd.in");
   f>>t;


   for(int i=1;i<=t;++i)
   {
       f>>n;
       solve(n);
   }
   f.close();
   g.close();
   return 0;

}