Cod sursa(job #2973048)

Utilizator alexscanteieScanteie Alexandru alexscanteie Data 30 ianuarie 2023 21:11:28
Problema Suma si numarul divizorilor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.48 kb
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;

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


const int N = 1e6 + 5;
bool is_prime[N];
int primes[N], cnt_primes;

void sieve() {
    memset(is_prime, true, sizeof is_prime);
    is_prime[0] = is_prime[1] = false;
    for (int i = 2; i <= N - 5; i++) {
        if (is_prime[i]) {
            primes[cnt_primes++] = i;
            for (int j = 2 * i; j <= N - 5; j += i) {
                is_prime[j] = false;
            }
        }
    }
}

int t, cnt;
ll n, sum;

int main() {
    sieve();
    fin >> t;
    while (t--) {
        fin >> n;
        sum = 1;cnt = 1;
        int sqrt_n = sqrt(n);
        if(is_prime[n]){
            sum = 1 + n;
            cnt = 2;
        }
        else{
        for (int i = 0; i < cnt_primes && primes[i] <= sqrt_n; i++) {
            if (n % primes[i] == 0) {
                int p = primes[i], k = 0;
                while (n % p == 0) {
                    n /= p;
                    k++;
                }
                sum *= ((ll)pow(p, k + 1) - 1) / (p - 1);
                cnt *= (k + 1);
            }
        }}
        fout << cnt << " " << sum % 9973 << endl;
    }
    return 0;
}



/*#include <fstream>
#include <iostream>
#include <cstring>
using namespace std;

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

int n,teste;
bool prime[100001];

void eratostene(){
    for(int i=2;i<=n;i++){
        if(prime[i]==false){
            for(int j=2*i;j<=n;j++)
                prime[i]=true;
        }
    }
}

int put(int a,int b){
    int p=1;
    while(b--){
        p *=a;
    }
    return p;
}


int main(){
    fin>>teste;
    eratostene();
    while(teste--){
        fin>>n;
        int d[1001],p[1001];
        memset(d,0,sizeof(d));
        memset(p,0,sizeof(p));

        for(int i=2;i*i<=n;i++){
            if(prime[i]==false){
                p[i]=i;
                while(n%i==0){
                    d[i]++;
                    n /= i;
                }
            }
        }
        long long nr_div=1;
        for(int i=2;i*i<=n;i++){
            if(d[i]!=0){
                nr_div *= (d[i]+1);
            }
        }
        long long suma_div=0;
        for(int i=2;i*i<=n;i++){
            if(p[i]!=0){
                suma_div += ((put(p[i],d[i]+1)-1)/(p[i]-1));
            }
        }
        fout<<nr_div<<' '<<suma_div<<'\n';
    }

    return 0;
}*/