Cod sursa(job #2145187)

Utilizator ardutgamerAndrei Bancila ardutgamer Data 27 februarie 2018 10:26:55
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
#include <cstdio>
#include <cmath>
#include <vector>
#include <bitset>

using namespace std;

bitset<1000005>c;
vector<int>prime;

inline void ciur(int n)
{
    c[1] = c[0] = 1;
    for(int i = 4 ; i <= n ; i += 2)
        c[i] = 1;
    int lim = (int)sqrt((double)n);
    for(int i = 3 ; i <= lim ; i += 2)
    {
        if(c[i] == 0)
        {
            for(int j = i * i ; j <= n ; j += 2*i)
                c[j] = 1;
        }
    }
}

inline void completePrimes(int n)
{
    for(int i = 0 ; i <= n ; i++)
    {
        if(c[i] == 0)
            prime.push_back(i);
    }
}

inline long long int mypow(int x,int y)
{
    long long int p = 1;
    for(int i = 1 ; i <= y ; i++)
        p *= 1LL * x;
    return p;
}

inline void solve(int n)
{
    if(c[n] == 0)
    {
        printf("2 %d\n",n+1);
        return;
    }
    long long int sumdiv = 1;
    int nrdiv = 1;
    int k = 0;
    int lim = (int)sqrt((double)n);
    int e = 0;
    while(prime[k] <= lim && n > 1)
    {
        e = 0;
        while(n % prime[k] == 0)
        {
            n /= prime[k];
            e++;
        }
        if(e > 0)
        {
            nrdiv *= (e+1);
            sumdiv *= (1LL * mypow(prime[k],e+1)-1) / (prime[k]-1);
        }
        k++;
    }
    printf("%d %d\n",nrdiv,sumdiv);
}

int main()
{
    freopen("ssnd.in","r",stdin);
    freopen("ssnd.out","w",stdout);
    ciur(1000000);
    completePrimes(1000000);
    int t,n;
    scanf("%d",&t);
    for(int i = 1 ; i <= t ; i++)
    {
        scanf("%d",&n);
        solve(n);
    }
    return 0;
}