Cod sursa(job #976960)

Utilizator Daniel3717Aleca Daniel Adrian Daniel3717 Data 24 iulie 2013 14:23:05
Problema Suma si numarul divizorilor Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
#include <iostream>
#include <fstream>
#include <bitset>
using namespace std;
int v[80000];
void declare()
{
    bitset <1000002> b;
    int i,i1,n;
    b[0]=1;
    b[1]=1;
    for (i=2;i<=1000000;i++)
        if (b[i]==0)
            for (i1=i*2;i1<=1000000;i1=i1+i)
                b[i1]=1;
                n=0;
    for (i=1;i<=1000000;i++)
        if (b[i]==0)
            {
                n++;
                v[n]=i;
            }

}
struct struct1
{
    int k, val;
} x[80000];
long long nr,sd,nd,ax;
int n,i,pos,nk;
int main(void)
{
    declare();
    FILE * f;
    f=fopen("ssnd.in","r");
    ofstream g("ssnd.out");
    fscanf(f,"%d",&n);
    for (i=1;i<=n;i++)
    {
        fscanf(f,"%I64d",&nr);
        pos=1;
        nd=1;
        sd=1;
        while (nr>=v[pos]*v[pos])
        {
            if (nr%v[pos]==0)
                {
                    ax=v[pos];
                    nk++;
                    x[nk].val=v[pos];
                    while (nr%v[pos]==0)
                    {
                        ax=ax*v[pos];
                        x[nk].k++;
                        nr=nr/v[pos];
                    }
                    ax=ax-1;
                    ax=ax/(v[pos]-1);
                    nd=nd*(x[nk].k+1);
                    sd=(sd*ax)%9973;
                }
            pos++;
        }
        if (nr!=1)
        {
            nd=nd*2;
            sd=(sd*((nr*nr-1)/(nr-1)))%9973;
        }
        g<<nd<<' '<<sd<<'\n';
    }
    g.close();
    return 0;
}