Cod sursa(job #2738348)

Utilizator FrostfireMagirescu Tudor Frostfire Data 5 aprilie 2021 18:40:18
Problema Suma si numarul divizorilor Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.19 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cmath>
#include <bitset>
#define MOD 9973
#define DIM 1000000
#define ll long long

using namespace std;

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

int t;
bitset <DIM+10> ciur;
vector <ll> prime;

void sieve()
{	ciur[0] = ciur[1] = 1;
	for(int i=2; i<=DIM; i++)
		if(!ciur[i])
			{	prime.push_back(i);
				for(int j=2*i; j<=DIM; j+=i)
					ciur[j] = 1;
			}
}

ll lgput(ll a, ll n)
{	if(!n)
		return 1;
	if(n % 2 == 0)
		return lgput(a*a % MOD, n/2);
	return a * lgput(a*a % MOD, n/2) % MOD;
}

int main()
{
	sieve();
	fin >> t;
	while(t--)
		{	ll n;
			fin >> n;
			ll n1 = n, sq = sqrt(n), sum = 1, nr = 1;
			for(ll i=0; prime[i]<=sq && n1 > 1; i++)
				if(n1 % prime[i] == 0)
					{	ll cnt = 0;
						while(n1 % prime[i] == 0)
							n1 /= prime[i], cnt++;
						nr = nr * (cnt + 1) % MOD;
						sum = sum * (lgput(prime[i], cnt + 1) - 1 + MOD) % MOD * lgput(prime[i] - 1, MOD - 2) % MOD;
					}
			if(n1 > 1)
				{	nr = nr * 2 % MOD;
					sum = sum * (lgput(n1, 2) - 1 + MOD) % MOD * lgput(n1 - 1, MOD - 2) % MOD;
				}
			fout << nr << ' ' << sum << '\n';
		}
	return 0;
}