Cod sursa(job #2086026)

Utilizator rangal3Tudor Anastasiei rangal3 Data 11 decembrie 2017 10:13:06
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
#include <fstream>
#include <cstring>
#define file "ssnd"
#define N 1000000
#define MOD 9973
using namespace std;

ifstream fin(file".in");
ofstream fout(file".out");

long long t,n;
long long d[N],dn,a[N];

inline void desc()
{
    dn = 0;
    int div = 2;
    memset(a,0,sizeof(a));

    if(n%div == 0) d[++dn] = div;
    while(n%div == 0) n/=div,++a[dn];
    ++div;

    do
    {
        if(n%div == 0) d[++dn] = div;
        while(n%div == 0) n/=div,++a[dn];

        if(div * div > n) div = n;
            else div+=2;
    }while(n > 1);
}

inline void afis()
{
    for(int i=1; i<=dn; ++i)
        fout<<d[i]<<" "<<a[i]<<endl;
}

inline long long c1()
{
    long long sol = a[1] + 1;
    sol %= MOD;
    for(int i=2; i<=dn; ++i)
        sol = (sol*(a[i]+1))%MOD;
    return sol;
}

inline long long rid_log(const long long &A,const long long &B)
{
    if(B == 1) return A;
    else if(B < 1) return 1;

    long long sol = rid_log(A,B/2);

    if(B%2) return ((sol*sol)%MOD * A)%MOD;
        else return (sol*sol)%MOD;
}

inline long long inv_mod(long long X)
{
    return rid_log(X,MOD-2);
}

inline long long c2()
{
    long long sol = 1;
    for(int i=1; i<=dn; ++i)
        sol = (sol*((rid_log(d[i],a[i]+1) - 1) * inv_mod(d[i]-1) % MOD) ) %MOD;
    return sol;
}

int main()
{
    fin>>t;
    while(t--)
    {
        fin>>n;
        desc();
        //afis();
        fout<<c1()<<" "<<c2()<<"\n";
    }
    fin.close();
    fout.close();
    return 0;
}