Cod sursa(job #2601265)

Utilizator Galatanu_BogdanGalatanu Bogdan Ioan Galatanu_Bogdan Data 14 aprilie 2020 11:20:29
Problema Suma si numarul divizorilor Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.57 kb
#include <fstream>
#include <vector>
#define limit 1000000
#define MOD 9973
using namespace std;

ifstream cin("ssnd.in");
ofstream cout("ssnd.out");

int ciur[1000001];
vector<int>primNumbers;
void eratosthenes()
{
    primNumbers.push_back(2);
    for(int i=3;i<=limit;i+=2)
        if(!ciur[i])
        {
            primNumbers.push_back(i);
            for(int j = 2 * i;j<=limit;j+=i)
                ciur[j] = 1;
        }
}


long long pow(long long x,long long p)
{
    if(p == 0)
        return 1;
    if(p == 1)
        return x;
    
    long long rez = pow(x, p/2) % MOD;
    
    if(p % 2 == 0)
        return (rez * rez) % MOD;
    
    return ((rez * rez) % MOD * x) % MOD;
}

void descompunere(long long x,long long &card, long long &sum)
{
    long long i = 0, exp, d, p1, p2;
    
    card = 1;
    sum = 1;
    d = primNumbers[i];
    while(x != 1)
    {
        exp = 0;
        
        while(x % d == 0)
        {
            exp++;
            x/=d;
        }
        
        if(exp > 0){
            
            p1 = (pow(d, exp+1) - 1) % MOD;
            p2 = pow(d - 1, MOD - 2) % MOD;
            sum = (((sum * p1) % MOD) * p2) % MOD;
            
            card *= (exp + 1);
            card %= MOD;
            
        }
        
        i++;
        d = primNumbers[i];
        if(d * d > x)
            d = x;
            
    }
}

int main()
{
    long long card,sum,t,n;
    
    cin>>t;
    
    eratosthenes();
    
    
    for(long long i=1;i<=t;i++)
    {
        cin>>n;
        descompunere(n, card, sum);
        cout<<card<<" "<<sum<<'\n';
    }
    
}