Cod sursa(job #2565109)

Utilizator Teo_1101Mititelu Teodor Teo_1101 Data 2 martie 2020 12:13:51
Problema Suma si numarul divizorilor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.76 kb
#include <bits/stdc++.h>

using namespace std;

const int NMAX = 1000005;
const int MOD = 9973;

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

int T;
long long x;
bool C[NMAX];

vector < int > P;

void Ciur()
{
    C[2] = 1;
    for( int i = 3; i <= NMAX-5; i += 2 )
        C[i] = 1;

    for( int i = 3; i * i <= NMAX-5; i+= 2 )
    {
        if( C[i] == 1 )
            for( int j = i*i; j <= NMAX-5; j += 2*i )
                C[j] = 0;
    }

    P.push_back( 2 );
    for( int i = 3; i <= NMAX-5; i += 2 )
        if( C[i] ) P.push_back( i );
}

int Exp( int x, int p )
{
    if( p == 0 ) return 1;

    int ans = Exp( x, p/2 );

    if( p%2 == 0 ) return ( ans * ans ) % MOD;
    else return ( x * ( ans * ans )%MOD )%MOD;
}

int Inv( int x )
{
    return Exp( x, MOD - 2 );
}
void DivSum( long long x )
{
    if( ( x <= NMAX-5 ) && C[x] == 1 )
    {
        fout << 2 << ' ' << x+1 << '\n';
        return;
    }

    long long ct = 1;
    long long D = 1;
    int k = 0;
    long long n = x;
    for( int i = 0; i < P.size() && 1LL*P[i]*P[i] <= n ; ++i )
    {
        if( x%P[i] == 0 )
        {
            while( x % P[i] == 0 )
            {
                x /= P[i];
                k++;
            }
            ct *= (k+1);
            D = (D * (Exp( P[i], k+1 ) - 1 )) % MOD;
            D = ( D * Inv( P[i] - 1 ) )%MOD;
            //cout << D << ' ';
            k = 0;
        }
    }

    if( x > 1 )
    {
        ct++;
        D = 1LL * x + D;
    }
    else fout << ct << ' ' << D << '\n';
}
void Solve()
{
    Ciur();
    fin >> T;

    for( int i = 1; i <= T; ++i )
     {
         fin >> x;
         DivSum( x );
     }
}
int main()
{
    Solve();
    return 0;
}