Cod sursa(job #2926436)

Utilizator SamurayxJackDiaconescu Octavian SamurayxJack Data 17 octombrie 2022 19:37:53
Problema Suma si numarul divizorilor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.01 kb
#include <bits/stdc++.h>

using namespace std;

#define maxsize 1000000

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

char at[maxsize / 16];
int n,x;

int isPrime(int x) {
    if (!(x & 1))
        if (x == 2) return 0 ;
        else return 1 ;
        else return (at[((x - 3) >> 1) >> 8] & (1 << (((x - 3) >> 1) & 7))) ;
}

void sieve() {
    int i, j;
    memset(at, 0, sizeof(at)) ;
    for (i = 3; i <= maxsize; i += 2)
        if (!at[((i - 3) >> 1) >> 8] & (1 << (((i - 3) >> 1) & 7)))
            for (j = i * i ; j <= maxsize ; j += i + i)
                at[((i - 3) >> 1) >> 8] |= (1 << (((i - 3) >> 1) & 7)) ;
}

void ss(int n){
int d=2,cnt=1,s=1;
if(!isPrime(n)) fout<<2<<" "<<n+1<<'\n';
else{
while(n>1){
    int p=0;
    while(n%d==0){p++,n/=d;}
    cnt*=(p+1);
    s*=(pow(d,p+1)-1)/(d-1);
    d++;
    while(isPrime(d)&&d*d<n) d++;
    if(d*d>=n) d=n;
}
fout<<cnt<<" "<<s<<'\n';
}
}

int main()
{  fin>>n;
sieve();
while(n--){fin>>x;ss(x);}
      return 0;
}