Cod sursa(job #2086035)

Utilizator rangal3Tudor Anastasiei rangal3 Data 11 decembrie 2017 10:29:53
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.95 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];
int prim[N+3],doarprim[N/2],pn; // 0 - prim 1 -Neprim

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

    for(int i=1; doarprim[i]*doarprim[i] <= n; ++i)
    {
        if(n%div == 0) d[++dn] = div;
        while(n%div == 0) n/=div,++a[dn];
    }

    if(n > 1)
        d[++dn] = n, a[dn] = 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;
}

void Ciur()
{
    prim[1] = 1;
    for(int i=4; i<=N; i+=2)
        prim[i] = 1;
    for(int i=3; i*i <= N; i+=2)
        if(!prim[i])
            for(int d = i*i; d<=N; d += 2*i)
                prim[d] = 1;
    doarprim[++pn] = 2;
    for(int i=3; i<=N; i+=2)
        if(!prim[i]) doarprim[++pn] = i;
}

void afis_ciur()
{
    for(int i=1; i<=pn; ++i)
        fout<<doarprim[i]<<" ";
    fout<<endl;
}

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