Cod sursa(job #2040528)

Utilizator VladG26Ene Vlad-Mihai VladG26 Data 15 octombrie 2017 22:25:18
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.61 kb
#include <iostream>
#include <cstdio>
#include <vector>
#define MOD 9973
#define ll long long
using namespace std;
bool vCiur[100005];
vector <ll> vNrPrime;
pair<long long,long long> inversModular(ll a,ll b)
{
    if(!b)
        return make_pair(1,0);
    pair<ll,ll> p=inversModular(b,a%b);
    return make_pair(p.second,p.first-p.second*(a/b));
}
void ciur()
{
    for(int i=2; i<=100000; i++)
        if(!vCiur[i])
        {
            vNrPrime.push_back(i);
            for(int j=2; i*j<=100000; j++)
                vCiur[i*j]=true;
        }
}
ll lgput(ll nr,ll p)
{
    ll rez=1;
    while(p)
    {
        if(p%2)
        {
            rez*=nr;
        }
        nr*=nr;
        p/=2;
    }
    return rez;
}
void solve(ll nr)
{
    int cnt;
    ll nrDiv=1,sumDiv=1;
    for(int it=0;it<vNrPrime.size();it++)
    {
        if(vNrPrime[it]*vNrPrime[it]>nr)
            break;
        cnt=1;
        while(nr%vNrPrime[it]==0)
        {
            cnt++;
            nr/=vNrPrime[it];
        }
        if(cnt!=1)
        {
            sumDiv*=(((lgput(vNrPrime[it],cnt)-1)/(vNrPrime[it]-1)));
            sumDiv%=MOD;
            nrDiv*=cnt;
        }
    }
    if(nr!=1)
    {
        sumDiv*=((lgput(nr,2)-1))/((nr-1));
        sumDiv%=MOD;
        nrDiv*=2;
    }

    printf("%lld %lld\n",nrDiv,sumDiv);
}
int main()
{
    freopen("ssnd.in","r",stdin);
    freopen("ssnd.out","w",stdout);
    ciur();
    int t;
    long long nr;
    scanf("%d",&t);
    for(int i=1; i<=t; i++)
    {
        scanf("%lld",&nr);
        solve(nr);
    }
    return 0;
}