Cod sursa(job #2920856)

Utilizator andreibrosPeta Andrei Mathias andreibros Data 26 august 2022 14:00:13
Problema Suma si numarul divizorilor Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.38 kb
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;

const int NMAX=1000001;
bool ciur[NMAX];
int prim[80000];
int k;
void calcul(long long x)
{
    long long nr_div=1;
    long long suma=1;
    int i=1;
    long long cx=x;
    while(i<=k && prim[i]*prim[i]<=cx)
    {
        int nr=0;

        if(x%prim[i]==0)
        {
            nr=0;

            long long d=prim[i];
            while(x%prim[i]==0)
            {
                x/=prim[i];
                nr++;
            }

            nr_div*=(nr+1);
            suma*=((pow(d,nr+1)-1)/(d-1));
            suma=suma%9973;
        }
                i++;
    }
    if(x>1)
    {
        nr_div*=2;
        suma*=(pow(x,2)-1)/(x-1);
        suma=suma%9973;
    }

    printf("%lld %lld\n",nr_div,suma);
}
int main()
{

    freopen("ssnd.in","r",stdin);
    freopen("ssnd.out","w",stdout);
    ciur[0]=ciur[1]=1;
    for(int i=3; i<=1000; i+=2)
    {
        if(ciur[i]==0)
        {
            for(int j=2*i; j<=1000000; j=j+i)
                ciur[j]=1;

        }
    }

    k=1;
    prim[1]=2;
    for(int i=3; i<=1000000; i+=2)
        if(ciur[i]==0)
        {
            prim[++k]=i;
        }

    int t;
    long long n;
    scanf("%d",&t);
    for(int i=1; i<=t; i++)
    {
        scanf("%lld",&n);
        calcul(n);
    }

    return 0;
}