Cod sursa(job #2853486)

Utilizator MihaiCostacheCostache Mihai MihaiCostache Data 20 februarie 2022 12:38:53
Problema Suma si numarul divizorilor Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.43 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("ssnd.in");
ofstream fout("ssnd.out");
long long int n, x, ciur[1000001], k, prime[80001];

int power(long long int a, long long int b)
{
    long long ans=1;
    for(int i=1; i<=b; i++)
    {
        ans=ans*a;
    }
    return ans;
}

void eratostene()
{
    ciur[0]=1;
    ciur[1]=1;
    for(int i=2; i<=1000000; i++)
    {
        if(ciur[i]==0)
        {
            for(int j=i+i; j<=1000000; j+=i)
            {
                ciur[j]=1;
            }
        }
    }
    for(int i=2; i<=1000000; i++)
    {
        if(ciur[i]==0)
        {
            prime[++k]=i;
        }
    }
}

void calcul(long long x)
{
    int nrdiv=1;
    int suma=1;
    int i=1;
    while(i<=k && prime[i]*prime[i]<=x)
    {
        int p=0;
        if(x%prime[i]==0)
        {
            p=0;
            long long d=prime[i];
            while(x%prime[i]==0)
            {
                x/=prime[i];
                p++;
            }
            nrdiv*=(p+1);
            suma*=(power(d, p+1)-1)/(d-1);
            suma%=9973;
        }
        i++;
    }
    if(x>1)
    {
        nrdiv*=2;
        suma*=(power(x, 2)-1)/(x-1);
        suma%=9973;
    }
    fout<<nrdiv<<" "<<suma<<"\n";
}

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