Cod sursa(job #2812693)

Utilizator divadddDavid Curca divaddd Data 4 decembrie 2021 21:56:53
Problema Suma si numarul divizorilor Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.49 kb
#include <fstream>
#include <iostream>
using namespace std;
int t,k;
long long n;
bool ciur[1000002];
long long prime[80000];

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


int putere(int x, int p) {
	int rez = 1;
	x %= 9973;

	for(; p; p >>= 1) {
		if(p & 1) {
			rez *= x;
			rez %= 9973;
		}

		x *= x;
		x %= 9973;
	}

	return rez;
}

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

int main()
{
    for(int i = 3; i <= 1000; i += 2){
        if(ciur[i] == 0){
            for(int j = i*2; j < 1000000; j++){
                ciur[j] = 1;
            }
        }
    }
    k = 1;
    prime[1] = 2;
    for(int i = 3; i <= 1000000; i += 2){
        if(ciur[i] == 0){
            prime[++k] = i;
        }
    }

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