Cod sursa(job #1402858)

Utilizator BogdanisarBurcea Bogdan Madalin Bogdanisar Data 26 martie 2015 21:33:41
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.79 kb
#include<fstream>
#include<iostream>
#define MOD 9973
using namespace std;
ifstream f("ssnd.in");
ofstream g("ssnd.out");
long long N,i,j,T,rad,psuma,pnr,put,nr,exponent,da,putere;
long long nrprime[500100];
bool nprim[500100];

void eratos();
inline long long pow(long long,long long);

int main()
{
    f>>T;
    nrprime[++nrprime[0]]=2;
    eratos();
    for (i=0;i<T;++i)
    {
        f>>N;
        psuma=pnr=1;
        for (j=1;j<=nrprime[0] && 1LL*nrprime[j]*nrprime[j]<=N;++j)
        {
            if (N%nrprime[j]==0)
            {
                put=0;
                while (N%nrprime[j]==0)
                {
                    ++put;
                    N/=nrprime[j];
                }
                pnr*=(put+1);
                nr=nrprime[j];
                exponent=put+1;
                putere=(pow(nr,exponent)-1)%MOD;
                da=( putere*(pow(nr-1,MOD-2)%MOD) )%MOD;
                psuma=(psuma*da)%MOD;
            }
        }
        if (N>1)
        {
            pnr*=2;
            nr=N;
            exponent=2;
            putere=pow(nr,exponent)-1;
            da=(putere*(pow(nr-1,MOD-2)%MOD))%MOD;
            psuma=(psuma*da)%MOD;
        }
        g<<pnr%MOD<<' '<<psuma%MOD<<'\n';
    }
    f.close();g.close();
    return 0;
}

void eratos()
{
    for (i=1;(i<<1)+1<=1000005;++i)
    {
        if (!nprim[i])
        {
            nrprime[++nrprime[0]]=(i<<1)+1;
            for (j=(i*i<<1)+(i<<1);(j<<1)+1<=1000005;j+=(i<<1)+1)
                nprim[j]=true;
        }
    }
}

inline long long pow(long long base,long long exp)
{
    long long rez=1;
    base=base%MOD;
    while (exp>0)
    {
        if (exp%2==1) rez=(rez*base)%MOD;
        base=(base*base)%MOD;
        exp/=2;
    }
    return rez;
}