Cod sursa(job #2144538)

Utilizator DanielznaceniDaniel Danielznaceni Data 26 februarie 2018 19:49:30
Problema Suma si numarul divizorilor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.71 kb
#include <iostream>
#include <fstream>
#include <bitset>
#define lim 1000005
#define modul 9973
using namespace std;

bitset <lim> nope;
ifstream in("ssnd.in");
ofstream out("ssnd.out");

long long t, k, i, j, x, im=1;
long long prime[lim];

void ciur()
{
    for(i=2; i<=lim; ++i)
    {
        if(nope[i]==0)
        {
            prime[++k]=i;
            for(j=i+i; j<=lim; j=j+i)
            {
                nope[j]=1;
            }
        }
    }
}

int rezolvarea(long long x)
{
    long long nf, nd=1, sd=1, cop, i, im=1;
    for(i=1; i<=k && 1LL*prime[i]*prime[i]<=x; ++i)
    {
        if(x%prime[i]==0)
        {
            nf=0;
            while(x%prime[i]==0)
            {
                x/=prime[i];
                ++nf;
            }
            nd=nd*(nf+1);
            cop=prime[i];
            cop%=modul;
            ++nf;
            while(nf>1)
            {
                if(nf%2==0)
                {
                    cop=cop*cop;
                    cop=cop%modul;
                    nf/=2;
                }
                else
                {
                    im=im*cop;
                    cop*=cop;
                    cop%=modul;
                    nf=(nf-1)/2;
                }
            }
            cop*=im;
            --cop;
            cop%=modul;
            sd=(sd*((cop)/(prime[i]-1))%modul)%modul;
        }
    }
    if(x>1)
    {
        nd*=2;
        sd=1LL*sd*(x+1);
        sd=sd%modul;
    }
    sd=sd%modul;
    out<<nd<<" "<<sd<<"\n";
}
int main()
{
    long long t, i, x;
    ciur();
    in>>t;
    for(i=1; i<=t; ++i)
    {
        in>>x;
        rezolvarea(x);
    }
    return 0;
}