Cod sursa(job #2039150)

Utilizator VladG26Ene Vlad-Mihai VladG26 Data 14 octombrie 2017 11:59:37
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <iostream>
#include <cstdio>
#include <vector>
#define MOD 9973
#define ll long long
using namespace std;
bool vCiur[100005];
vector <int> 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%MOD;
            p--;
        }
        nr*=nr%MOD;
        p/=2;
    }
    return rez%MOD;
}
void solve(ll nr)
{
    int cnt;
    ll nrDiv=1,sumDiv=1;
    for(int it=0;it<vNrPrime.size();it++)
    {
        cnt=1;
        while(nr%vNrPrime[it]==0)
        {
            cnt++;
            nr/=vNrPrime[it];
        }
        nrDiv*=cnt;
        sumDiv*=(((lgput(vNrPrime[it],cnt)-1)*inversModular(vNrPrime[it]-1,MOD).first))%MOD;
    }

    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;
}