Cod sursa(job #658108)

Utilizator rootsroots1 roots Data 7 ianuarie 2012 22:11:20
Problema Suma si numarul divizorilor Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include <fstream>
#include <cstring>
#include <cmath>

#define MOD 9973
#define radMAX 1000000
#define pL 62502
#define dvzL 78499

using namespace std;

ifstream in;
ofstream out;

char p[pL];
int dvz[dvzL];

inline void radical(int a,int &b)
{
    double aux=sqrt(a);
    b=aux;
}

int main()
{
    int sum,nr,rad,N,x;

    memset(p,0,sizeof(p));
    for(int i=1;((i*i)<<2)+(i<<2)+1<=radMAX;++i)
        if((p[i>>3]&(1<<(i&7)))==0)
            for(int j=((i*i)<<1)+(i<<1);(j<<1)+1<=radMAX;j+=(i<<1)+1)
                p[j>>3]|=(1<<(j&7));

    memset(dvz,0,sizeof(dvz));
    dvz[0]=1;
    dvz[1]=2;
    for(int i=1;(i<<1)+1<=radMAX;++i)
        if((p[i>>3]&(1<<(i&7)))==0)
            dvz[++dvz[0]]=(i<<1)+1;

    in.open("ssnd.in");

    in>>N;

    out.open("ssnd.out");

    for(;N--;)
    {
        in>>x;
        radical(x,rad);

        sum=1;
        nr=1;
        for(int add,pow,cnt,i=1;i<=dvz[0]&&dvz[i]<=rad;++i)
        {
            pow=1;
            add=1;
            for(cnt=0;x!=1&&x%dvz[i]==0;x/=dvz[i],++cnt,pow*=dvz[i],pow%=MOD,add+=pow,add%=MOD);

            nr*=++cnt;
            nr%=MOD;
            sum*=add;
            sum%=MOD;
        }

        if(x!=1)
        {
            nr<<=1;
            nr%=MOD;
            sum*=(x+1);
            sum%=MOD;
        }

        out<<nr<<' '<<sum<<'\n';
    }

    in.close();
    out.close();

    return 0;
}