Cod sursa(job #768119)

Utilizator bratualexBratu Alexandru bratualex Data 16 iulie 2012 00:01:56
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.86 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);
    for(i=0;i<n;i++)
    {
        suma=1;
        nr=1;
        fin>>x;
        j=0;
        while(x!=1)
        //for(j=0;;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];
            }
            if (c)
            {
                /*int p1 = (putere(v[j], c+1) - 1)%REST;
                int p2 = putere(v[j]-1, REST-2) % REST;
                suma=(((suma%REST*p1)%REST)*p2)%REST;
                */
                sumaint=(sumaint+pksuma)%REST;
                suma=(suma*sumaint)%REST;
                nr=nr*(c+1);
            }
            if (c&&j==2)
                j=0;
            else
                j++;
        }
        fout<<nr<<" "<<suma%REST<<"\n";
    }
    //fout<<v[n+1]*v[n+1];


    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;
    }
}