Cod sursa(job #1140093)

Utilizator span7aRazvan span7a Data 11 martie 2014 18:49:15
Problema Suma si numarul divizorilor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include<fstream>
#include<cmath>
#define MOD 9973
#define maxim 1000005
using namespace std;
ifstream f("ssnd.in");
ofstream g("ssnd.out");
bool viz[maxim];
int v[80000];
int k,n,i,e1,e2,nrdiv=1,sumdiv=1,nr;
void ciur()
{
    nr=0;
    int i,j;
    for(i=2;i<=maxim;i++)
        if(viz[i]==0)
            {v[++nr]=i;
            for(j=i+i;j<=maxim;j+=i)
                viz[j]=1;
            }

}
int exp(int a,int b)
{
    int nr=0;
    while(a%b==0
          )
        {
            a/=b;
            nr++;
        }
    return nr;
}
int putere(int a,int k)
{int aux,sol;
    aux=a;
    sol=1;
    while(k)
    {
        if(k%2==1)sol=sol%MOD*aux%MOD;
        aux=aux%MOD*aux%MOD;k/=2;
    }
    return sol%MOD;
}
void calculeaza(int a)
{
    nrdiv=1;sumdiv=1;
    for(k=1;k*k<=a;k++)
        if(a%v[k]==0)
        {
            e1=exp(a,v[k]);
           // e2=exp(a,a/v[k]);
            nrdiv*=(e1+1);
          //  nrdiv*=(e2+1);
            sumdiv*=(((putere(v[k],(e1+1))%MOD-1)%MOD)/(v[k]-1)%MOD)%MOD;
            //sumdiv*=(pow(a/v[k],(e2+1))-1)/(a/v[k]-1);
        }
    if(nrdiv==1&&sumdiv==1)
        g<<2<<" "<<(1+a)%MOD<<'\n';
    else
    g<<nrdiv<<" "<<sumdiv%MOD<<'\n';
}
int main()
{
    int a;
    ciur();
    f>>n;
    for(i=1;i<=n;i++)
    {
        f>>a;
        calculeaza(a);
    }
    return 0;
}