Cod sursa(job #2713996)

Utilizator Amelia_MilcuMilcu Amelia Amelia_Milcu Data 1 martie 2021 07:12:57
Problema Suma si numarul divizorilor Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.51 kb
#include <fstream>
#define NMAX 1000000
#define MOD 9973
using namespace std;
ifstream fin("ssnd.in");
ofstream fout("ssnd.out");
bool c[NMAX + 5];
long long x;
int n,v[NMAX], p[NMAX/ 5 + 5], k;
int lgp(int a,int b)
{
    long long rez= 1;
    while(b)
    {
        if(b % 2)
            rez = rez* a % MOD, b--;
        else
            a = 1LL * a * a % MOD, b /= 2;
    }
    return rez;
}
int main()
{
    c[0] = c[1] = 1;
    for( int i = 1; i <= NMAX; i++ )
    {
        if( c[i] == 0 )
        {
            p[++k] = i;
            for( int j = i + i; j <= NMAX; j += i )
                c[j] = 1;
        }
    }

    for( int i = 1; i <= k; i++ )
        v[ p[i] ] = lgp( p[i] - 1, MOD - 2 );

    fin>>n;
    for(;n--;)
    {
        fin >> x;
        int nrd = 1,s = 1;
        for( int i = 1; i <= k && 1LL * p[i] * p[i] <= x; i++ )
        {
            if( x % p[i] != 0 )
                continue;
            int exp = 0;
            while( x % p[i] == 0 )
            {
                exp++;
                x /= p[i];
            }
            if( exp == 0 )
                continue;
            nrd *= (exp + 1);
            int y = lgp( p[i], exp + 1 ) - 1 + MOD;
            if( y >= MOD )
                y -= MOD;
            s = ( ( ( s * y ) % MOD ) * v[ p[i] ] ) % MOD;
        }

        if( x != 1 )
        {
            nrd *=2;
            s = ( 1LL * s * (x + 1) ) % MOD;
        }
        fout << nrd << " " << s << "\n";
    }
    return 0;
}