Cod sursa(job #768123)

Utilizator bratualexBratu Alexandru bratualex Data 16 iulie 2012 00:27:42
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.79 kb
#include <fstream>
#include <math.h>
#define REST 9973
using namespace std;
ifstream fin("ssnd.in");
ofstream fout("ssnd.out");
int ciur ( int );
char a[1000000];
int v[1000000];
int putere (int,int);
int main()
{
    int n,k=0,suma,nr,i,c,j,pksuma,sumaint;
    long long x;
    fin>>n;
    i=ciur (1000005);
    //v[2]=2;
   // v[0]=5;
    for(i=0;i<n;i++)
    {
        suma=1;
        nr=1;
        fin>>x;
        j=0;
        while(x!=1&&v[j-1]*v[j-1]<x)
        {
            if (!(x%v[j]))
            {
                c=0;
                pksuma=1;
                sumaint=0;
                while (!(x%v[j]))
                {
                    sumaint=(sumaint+pksuma)%REST;
                    pksuma=(pksuma*v[j])%REST;
                    c++;
                    x=x/v[j];
                }
                sumaint=(sumaint+pksuma)%REST;
                suma=(suma*sumaint)%REST;
                nr=nr*(c+1);
                j++;
            }
            else
                j++;
        }
        if (x==1)
            fout<<nr<<" "<<suma%REST<<"\n";
        else
            fout<<nr*2<<" "<<((suma%REST)*(x+1))%REST<<"\n";


    }



    return 0;
}

int ciur ( int n )
{
    int i,j,nr=1,k=0;
    v[k++]=2;
    for (i=1;(i<<1)+1<=n;i++)
    {
        if (a[i]=='\0')
        {
            v[k++]=2*i+1;
            nr++;
            for(j=i+i+i+1;(j<<1)+1<=n;j+=(i<<1)+1)
                a[j]='1';
        }

    }
    return nr;
}

int putere (int n , int k)
{
    long long aux;
    if (k==1)
        return n%REST;
    else
    {
        aux=(putere (n,k/2))%REST;
        if (k%2)
            return ((((aux)%REST*(aux)%REST)%REST)*(n)%REST)%REST;
        else
            return ((aux)%REST*(aux)%REST)%REST;
    }
}