Cod sursa(job #1591234)

Utilizator raducostacheRadu Costache raducostache Data 5 februarie 2016 22:04:03
Problema Suma si numarul divizorilor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.86 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;
unsigned long long power(unsigned long long n,unsigned long long p);
void ciure();
unsigned long long ndiv(long long x,long long &sumdiv)
{
    unsigned long long i,nr,e,s,sum=1;
    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);
        if(p)
        sum=(((sum * (power(p[i], e+1) - 1)) % mod) * power(p[i] - 1, mod - 2)) % mod;
        i++;
    }
    if(x>1)
        {nr*=2;sum*=(x+1)%mod;}
    sumdiv=sum;
    return nr;
}

//unsigned long long sumdiv(unsigned long long x);

int main()
{
    long long sdiv,a;
    ios_base::sync_with_stdio(false);
    ciure();
    fin>>n;
    for(int i=1; i<=n; i++)
    {
        fin>>x;
        a=ndiv(x,sdiv);
        fout<<a<<' '<<sdiv<<'\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;
}*/