Cod sursa(job #1591181)

Utilizator raducostacheRadu Costache raducostache Data 5 februarie 2016 20:43:21
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 kb
#include <fstream>
#define nrmax 3400000
#define mod 9973
using namespace std;
ifstream fin("ssnd.in");
ofstream fout("ssnd.out");

bool ciur[nrmax+1];
unsigned long long n,x,p[500000],z;

void ciure();
unsigned long long ndiv(long long x)
{
    unsigned long long i,nr,e;
    nr=1;
    i=1;
    while(p[i]*p[i]<=x && i<=z)
    {
        e=0;
        while(x%p[i]==0)
        {
            x/=p[i];
            e++;
        }
        nr*=(e+1);
        i++;
    }
    if(x>1)
        nr*=2;
    return nr;
}
unsigned long long power(unsigned long long n,unsigned long long p);
unsigned long long sumdiv(unsigned long long x);

int main()
{
    ios_base::sync_with_stdio(false);
    ciure();
    fin>>n;
    for(int i=1; i<=n; i++)
    {
        fin>>x;
        fout<<ndiv(x)<<' '<<sumdiv(x)%mod<<'\n';
    }
    return 0;
}
unsigned long long power(unsigned long long n,unsigned long long p)
{
    unsigned long long a=1;
    n %= mod;
    while(p>0)
    {
        if(p%2!=0)
            a=(a*n)%mod;
        p=p/2;
        n=(n*n);
        n %= mod;
    }
    return a;
}

void ciure()
{
    ciur[1]=ciur[0]=1;
    for( long long int i=2; i<=nrmax; i++)
        if(ciur[i]==0)
        {
            z++;
            p[z]=i;
            for(long long j=i*i; j<=nrmax; j+=i)
                ciur[j]=1;

        }
}

unsigned long long sumdiv(unsigned long long x)
{
    unsigned long long sum=1,i=1,e,s=0,j;
    while(p[i]*p[i]<=x && i<=z)
    {
        s=0;
        e=0;
        while(x%p[i]==0)
        {
            x/=p[i];
            ++e;
        }
        s = (power(p[i], e+1) - 1) * power(p[i] - 1, mod - 2);
        sum*=s%mod;
        i++;
    }
    if(x>1)
    sum*=(x+1)%mod;
    return sum;
}