Cod sursa(job #2499381)

Utilizator NeacsuMihaiNeacsu Mihai NeacsuMihai Data 26 noiembrie 2019 00:01:11
Problema Suma si numarul divizorilor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.77 kb
#include <iostream>
#include <fstream>

using namespace std;

bool pr[1000001];
int numar[78500];

long long putere (int x, int e)
{
    if(e==0) return 1;
    else
    {
        if(e%2==0) return putere(x*x, e/2);
        else return x* putere(x*x, e/2);
    }
}


int main()
{
    ifstream fin ("ssnd.in");
    ofstream fout ("ssnd.out");

    //cout<<"putere(2, 4)= "<<putere(2, 4)<<"\n";

    int n, i, z, e, cp, aux, nrdiv;
    long long x, suma;

    fin>>n;

    for(i=2; i*i<=1000000; i++)
    {
        if(pr[i]==0)
        {
            for(z=i*i; z<=1000000; z=z+i) pr[z]=1;
        }
    }

    aux=0;
    for(i=2; i<=1000000; i++)
    {
        if(pr[i]==0)
        {
            aux++;
            numar[aux]=i;
        }
    }


    for(i=1; i<=n; i++)
    {
        fin>>x;
        cp=x;

        suma=1;
        nrdiv=1;
        aux=1;
        e=0;

        while(x!=1 && numar[aux] * numar[aux] <=cp)
        {
            e=0;
            while(x% numar[aux]==0 && x!=1)
            {
                x=x/numar[aux];
                e++;
            }

            if(e!=0)
            {
                nrdiv=nrdiv* (e+1);
                suma=suma * ( ( (putere(numar[aux], e+1)-1) / ( numar[aux]-1) ) %9973 ) %9973;
            }
            //cout<<"( ( (putere("<<numar[aux]<<", "<<e+1<<")-1) / ( "<<numar[aux]<<"-1) ) %9973 ) %9973 = "<<( ( (putere(numar[aux], e+1)-1) / ( numar[aux]-1) ) %9973 ) %9973<<"\n";

            //cout<<"e= "<<e<<"\naux= "<<aux<<"\nnumar["<<aux<<"]= "<<numar[aux]<<"\n\n";

            aux++;
        }


        if(x!=1)
        {
            fout<<2<<' '<<cp+1<<"\n";
        }

        else
        {
            fout<<nrdiv<<' '<<suma<<"\n";
        }
    }
}