Cod sursa(job #1095235)

Utilizator Dddarius95Darius-Florentin Neatu Dddarius95 Data 30 ianuarie 2014 16:27:00
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
// Suma si nr. divizorilor lui N - O(sqrt(N))
// S= II(p^(k+1)-1)/(p-1)
// D= II(k+1)
#include <fstream>
#include <bitset>
#define Nmax 1000000
#define X 9973
using namespace std;
ifstream f("ssnd.in");ofstream g("ssnd.out");

int T,P[100000];
bitset < Nmax+99 > v;
long long N,D,S;

long long Putere(long long N,long long P);

inline void SSND(long long N,long long &D, long long &S)
{
    D=1,S=1;
    for(int i=1;i<=P[0] && P[i]*P[i]<=N;++i)
        if(N % P[i]==0)
        {
            int k=0;
            while(N % P[i]==0)N/=P[i],++k;
            D*=(k+1);
            int x1=(Putere(P[i],k+1)-1) % X;
            int x2= Putere(P[i]-1,X-2);
            S=(S*x1*x2) % X;
        }
    if(N>1)
    {
        D*=2;
        S=(S*(N+1) % X);
    }
}

void Ciur();
int main()
{
    Ciur();
    f>>T;
    for(int i=1;i<=T;++i)f>>N,SSND(N,D,S),g<<D<<' '<<S<<'\n';
    f.close();g.close();
    return 0;
}

void Ciur()
{
    P[++P[0]]=2;
    for(int i=3;i<=Nmax;i+=2)
        if(!v[i])
        {
            P[++P[0]]=i;
            if(i<=1000)
                for(int j=i*i;j<=Nmax;j+=i)v[j]=1;
        }
}

long long Putere(long long N,long long P)
{

    long long m=1;
    while (P!=1)
          if(P % 2==0)N=(N*N) % X,P/=2;
          else m=(m*N) % X,--P;
    return (m*N)% X;
}