Cod sursa(job #2174788)

Utilizator AndreiD31Dragan Andrei AndreiD31 Data 16 martie 2018 13:28:00
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include <fstream>
#include <iostream>
using namespace std;
ifstream f("ssnd.in");
ofstream g("ssnd.out");


int putere1(int baza,int putere)
{

    int P=1;
    while(putere!=0)
    {
        if(putere%2==1){P=(P*baza)%9973;putere--;}
        else {putere=putere/2;baza=(baza*baza)%9973;}
    }

    return P%9973;


}





long long d,t,i,prod,n,x,N,p,prod1,j,NR_DIV,SUMA_DIV,v[100001];
bool a[1000005];

int main()
{
//g<<(sizeof(a)+sizeof(v))/1024.0<<'\n';
    a[1]=1;
    a[0]=1;
    for(d=2; d<1000005; d++)
        if(a[d]==0)
        {
            t++;
            v[t]=d;
            for(i=d+d; i<1000005; i=i+d)
                a[i]=1;
        }



    N=t;
    f>>n;
    for(i=1; i<=n; i++)
    {
        f>>x;
        t=1;

        NR_DIV=1;SUMA_DIV=1;
        while(v[t]*v[t]<=x&&t<=N)
        {
            p=0;
            prod=1;
            while(x%v[t]==0)
            {
                p++;
                x=x/v[t];
            }


            NR_DIV=NR_DIV*(p+1);

            prod=putere1(v[t],p+1)-1;
            prod1=putere1(v[t]-1,9971);
            SUMA_DIV=SUMA_DIV*(prod*prod1)%9973;


            t++;
        }

        if(x!=1)
        {
            NR_DIV=NR_DIV*2;
            SUMA_DIV=(SUMA_DIV*(x+1))%9973;
        }


      g<<NR_DIV<<" "<<SUMA_DIV%9973<<'\n';
    }



    return 0;
}