Cod sursa(job #2935607)

Utilizator stefanscdStefan stefanscd Data 7 noiembrie 2022 08:47:34
Problema Suma si numarul divizorilor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.08 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("ssnd.in");
ofstream fout("ssnd.out");
const int nmax=1000005;
const int MOD=9973;
long long n;
int t,k,p[nmax];
bitset <nmax> viz;
void ciur(){
    for(int i=2;i<nmax;i++){
        if(viz[i]==0){
            p[++k]=i;
            for(int j=i+i;j<nmax;j+=i)
                viz[j]=1;
        }
    }
}

int pow(int x,int p){
    int rez = 1;
	x %= MOD;

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

		x *= x;
		x %= MOD;
	}

	return rez;
}

void rezolvare(){
    fin>>n;
    int nd=1;
    int sd=1;
    for(int i = 1; i <= k && 1LL * p[i] * p[i] <= n; ++i) {
		if(n % p[i]) continue;
		int put = 0;

		while(n % p[i] == 0) {
			n /= p[i];
			++put;
		}

		nd *= (put+1);

		int p1 = (pow(p[i], put+1) - 1) % MOD;
		int p2 = pow(p[i]-1, MOD-2) % MOD;

		sd = (((sd * p1) % MOD) * p2) % MOD;
	}
	if(n>1){
        nd*=2;
        sd=(1LL*sd*(n+1)%MOD);
	}
	fout<<nd<<" "<<sd;
}

int main()
{
	ciur();
	for(fin>>t;t;--t)
        rezolvare();
	return 0;
}