Cod sursa(job #658117)

Utilizator rootsroots1 roots Data 7 ianuarie 2012 22:26:54
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.47 kb
#include <fstream>
#include <cstring>

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

using namespace std;

ifstream in;
ofstream out;

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

int main()
{
    int sum,nr,N;
    long long 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));
    memset(ddvz,0,sizeof(ddvz));
    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;
            ddvz[dvz[0]]=((i*i)<<2)+(i<<2)+1;
        }

    in.open("ssnd.in");

    in>>N;

    out.open("ssnd.out");

    for(;N--;)
    {
        in>>x;

        sum=1;
        nr=1;
        for(int add,pow,cnt,i=1;i<=dvz[0]&&ddvz[i]<=x;++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)
        {
            ++x;
            x%=MOD;

            nr<<=1;
            nr%=MOD;
            sum*=x;
            sum%=MOD;
        }

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

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

    return 0;
}