Cod sursa(job #968618)

Utilizator alex_HarryBabalau Alexandru alex_Harry Data 2 iulie 2013 13:20:59
Problema Suma si numarul divizorilor Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 2 kb
#include <fstream>
#include <string.h>
#include <math.h>
using namespace std;
ifstream f("ssnd.in");
ofstream g("ssnd.out");
int 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;
        }
    }
}
int power_log(int n,int p)
{
    int sol=1;
    while(p)
    {
        if(p%2==1)
            sol=(sol*n)%9973;
        n=(n*n)%9973;p=p/2;
    }
    return sol;
}
int invers_mod(int A)
{
    return power_log(A,9971);
}
void sum_and_nb_div(long long x)
{
    int i=1,nb_div=1,sum=1,exponent=0;
    while(x!=1)
    {
        exponent=0;
        while(x%prime_nb[i]==0)
        {
            x/=prime_nb[i];
            exponent++;
        }
        nb_div*=(exponent+1);
        sum*=((long long)(power_log(prime_nb[i],exponent+1)-1)*(long long)invers_mod(prime_nb[i]-1))%9973;
        sum%=9973;
        i++;
        if(prime_nb[i]>(int)sqrt((double)x))
            break;
    }
    if(x!=1)
    {
        sum*=((long long)(power_log(x,2)-1)*(long long)invers_mod(x-1))%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;
}