Cod sursa(job #1379292)

Utilizator BogdanisarBurcea Bogdan Madalin Bogdanisar Data 6 martie 2015 17:18:19
Problema Suma si numarul divizorilor Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.85 kb
#include<fstream>
#include<iostream>
#include<cmath>
using namespace std;
ifstream f("ssnd.in");
ofstream g("ssnd.out");
long long T,N,i,j,rad,psuma,pnr,put;
bool nprim[500100];
bool ok;

void eratos();

int main()
{
    f>>T;
    eratos();
    for (i=0;i<T;++i)
    {
        f>>N;
        rad=sqrt(N);
        psuma=pnr=1;
        put=0;
        ok=false;
        if (N%2==0)
        {
            ok=true;
            while (N%2==0)
            {
                ++put;
                N/=2;
            }
            pnr*=(put+1);
            psuma*=(pow(2,put+1)-1);
        }
        for (j=1;(j<<1)+1<=rad;++j)
        {
            //cout<<N<<' '<<j<<' '<<nprim[j]<<'\n';
            if (!nprim[j] && N%((j<<1)+1)==0)
            {
                //cout<<j;
                ok=true;
                put=0;
                while (N%((j<<1)+1)==0)
                {
                    ++put;
                    N/=((j<<1)+1);
                }
                pnr*=(put+1);
                //cout<<psuma<<' ';
                long long nr=(j<<1)+1;
                long long exponent=put+1;
                long double putere=pow(nr,exponent);
                long long da=putere/(nr-1);
                psuma*=da;
                //cout<<psuma;
            }
        }
        if (N>1)
        {
            pnr*=2;
            long long nr=(j<<1)+1;
            long long exponent=2;
            long double putere=pow(nr,exponent);
            long long da=putere/(nr-1);
            psuma*=da;
        }
        g<<pnr<<' '<<psuma%9973<<'\n';
    }
    f.close();g.close();
    return 0;
}

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