Cod sursa(job #968830)

Utilizator alex_HarryBabalau Alexandru alex_Harry Data 2 iulie 2013 20:45:35
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.39 kb
#include <fstream>
#include <string.h>
#include <math.h>
using namespace std;
ifstream f("ssnd.in");
ofstream g("ssnd.out");
long long prime_nb[1000002],length_prime,last_div,T;
long long N;
bool is_prime[1000002];
void Eratostenes()
{
    int i,j;
    for(i=2;i<=1000000;i++)
    {
        if(is_prime[i]==0)
        {
            prime_nb[++length_prime]=i;
            for(j=i+i;j<=1000000;j+=i)
                is_prime[j]=1;
        }
    }
}
long long power_log(long long n,long long p)
{
    long long sol=1;
    while(p)
    {
        if(p%2==1)
            sol=(sol*n)%9973;
        n=(n*n)%9973;p=p/2;
    }
    return sol;
}
long long invers_mod(int A)
{
    long long result=power_log(A,9971);
    while(result<0)
        result+=9973;
}
void sum_and_nb_div(long long x)
{
    long long i=1,nb_div=1,sum=1,exponent=0;
    while(x!=1)
    {
       if(x%prime_nb[i]==0)
       {

            exponent=0;
            long long value;
            while(x%prime_nb[i]==0)
            {
                x/=prime_nb[i];
                exponent++;
            }
            value=((power_log(prime_nb[i],exponent+1)-1+9973)%9973);
            if(value<0)
                value+=9973;
            nb_div*=(exponent+1);
            sum*=(value*(invers_mod(prime_nb[i]-1))%9973)%9973;
            sum%=9973;
       }
        i++;
        if(prime_nb[i]>(long long)sqrt((double)x))
            break;
    }
    if(x!=1)
    {
         long long value;
         value=((power_log(x,exponent+1)-1+9973)%9973);
         if(value<0)
            value+=9973;
        sum*=(value*(invers_mod(x-1))%9973)%9973;
        sum%=9973;
        nb_div*=2;
    }
    g<<nb_div<<" "<<sum<<"\n";
}

/*void Sum_of_div()
{
    int i,limit=(int)sqrt((double)N),result=1;
    for(i=1;i<=limit;i++)
    if(exponent!=0)
    {
         result*=((long long)(power_log(prime_nb[i],exponent+1)-1)*(long long)invers_mod(prime_nb[i]-1))%9973;
         result%=9973;
    }
    if(last_div!=0)
    {
        result*=((long long)(power_log(last_div,2)-1)*(long long)invers_mod(last_div-1))%9973;
        result%=9973;
    }
    g<<result<<"\n";
}*/
void Read_and_Process()
{
    f>>T;
    int i;
    for(i=1;i<=T;i++)
    {
        last_div=0;
        f>>N;
        sum_and_nb_div(N);

    }
}
int main()
{
    Eratostenes();
    Read_and_Process();
    return 0;
}