Cod sursa(job #1064223)

Utilizator margikiMargeloiu Andrei margiki Data 21 decembrie 2013 17:43:57
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.66 kb
# include <fstream>
# include <algorithm>
# include <bitset>
# include <cmath>
# define N_Max 1000000
using namespace std;
ifstream f("ssnd.in");
ofstream g("ssnd.out");
bitset <1000005> p;
int a[200000],ap[100000],var[100000];
int i,j,k,n,VV,d,ndiv,suma,x,nr;
long long inm;
long long putere ()
{
    int q;
    long long QQ=1,w=var[j];
    q=ap[j]+1;
    while (q!=0)
    {
        if (q%2==1)
        {
            QQ=QQ*w;
            --q;
        }
        else
        {
            w=w*w;
            q=q/2;
        }
        w=w%9973;
        QQ=QQ%9973;
    }
    return QQ;
}
int main ()
{
    a[1]=2;
    k=1;
    for (i=3; i<=N_Max; i=i+2)
    {
        if (p[i]==0)
        {
            a[++k]=i;
            for (j=3; i*j<=N_Max; j=j+2)
                p[i*j]=1;
        }
    }
    f>>n;
    for (i=1; i<=n; ++i)
    {
        f>>x;
        if (x==1)
        {
            g<<"1 1\n";
            continue;
        }
        VV=1; d=sqrt((double)x);
        nr=0; ndiv=1; suma=1;
        while (a[VV]<=d && x!=1)
        {
            if (x%a[VV]==0)
            {
                var[++nr]=a[VV]; ap[nr]=0;
                while (x%a[VV]==0)
                {
                    ++ap[nr];
                    x=x/a[VV];
                }
            }
            ++VV;
        }
        if (x!=1)
        {
            g<<"2 "<<x+1<<"\n";
            continue;
        }
        for (j=1; j<=nr; ++j)
        {
            ndiv=ndiv*(ap[j]+1);
            inm=putere ();
            suma=suma*((inm-1)/(var[j]-1))%9973;
        }
        g<<ndiv<<" "<<suma<<"\n";
    }


    return 0;
}