Cod sursa(job #2219939)

Utilizator AlexandruGabrielAliciuc Alexandru AlexandruGabriel Data 10 iulie 2018 00:46:50
Problema Suma si numarul divizorilor Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include <fstream>

#define N 1000001

using namespace std;

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

bool ciur[N];
long long prime[79000],x;
int n,k,mod=9973;

void Ciur ()
{
    ciur[1]=1;
    for (int i=4;i<=N;i+=2)
        ciur[i]=1;
    for (int i=3;i*i<=N;i+=2)
        if (!ciur[i])
        for (int j=i*i;j<=N;j+=2*i) ciur[j]=1;
    for (int i=2;i<=N;i++)
        if (!ciur[i])
    {
        k++;
        prime[k]=i;
    }
}

int Putere (int a, int p)
{
    long long ans=1;
    while (p)
    {
        if (p%2==1)
        {
            ans*=a;
            //ans%=mod;
            p--;
        }
        a*=a;
        //a%=mod;
        p/=2;
    }
    return ans;
}

void Divizori (int x)
{
    long long sum=1,t=1,nrdiv=1,cnt=0,d;
    d=prime[1];
    while (x!=1)
    {
        cnt=0;
        if (x%d==0)
        {
            while (x%d==0)
            {
                x=x/d;
                cnt++;
            }
            nrdiv*=(cnt+1);
            sum*=((Putere(d,cnt+1)-1)/(d-1));
        }
        if (d*d<=x) t++, d=prime[t];
        else d=x;
    }
    fout<<nrdiv<<" "<<sum%mod<<"\n";
}

int main()
{
    Ciur();
    fin>>n;
    for (int i=1;i<=n;i++)
    {
        fin>>x;
        Divizori(x);
    }
    return 0;
}