Cod sursa(job #2403970)

Utilizator alex2209alexPavel Alexandru alex2209alex Data 12 aprilie 2019 10:09:47
Problema Suma si numarul divizorilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.04 kb
#include <bits/stdc++.h>

using namespace std;
ifstream f("ssnd.in");
ofstream g("ssnd.out");
//----------------------------
//Variabile globale
vector<int>v;
int mod = 9973;
//----------------------------
//Functii
void ciur();
void citire();
void rezolva(long long);
long long putere(long long,int);
long long invers_modular(long long);
//----------------------------
int main()
{
	ciur();
	citire();
	return 0;
}
//----------------------------
void ciur()
{
	bool prim[1000001] = {0};
	int nr = 1000000;
	for(int i = 2 * 2; i <= nr; i += 2)
		prim[i] = 1;
	v.push_back(2);
	for(int i = 3; i * i <= nr; i += 2)
		if(prim[i] == 0)
		{
			v.push_back(i);
			for(int j = i * i; j <= nr; j += 2 * i)
				prim[j]=1;
		}
	for(int i = 1001; i <= nr; i += 2)
		if(prim[i] == 0)
			v.push_back(i);
}
//----------------------------
long long putere(long long a,int b)
{
	if(b==1)
		return a;
	if(b == 0)
		return 1;
    if(b % 2 == 0)
        return putere((a * a) % mod,b / 2);
    return (a*putere((a * a) % mod,b / 2)) % mod;
}
//----------------------------
long long invers_modular(long long x)
{
	return putere(x,mod - 2);
}
//----------------------------
void citire()
{
	int t;
	f >> t;
	while(t--)
	{
		long long x;
		f >> x;
		rezolva(x);
	}
}
//----------------------------
void rezolva(long long x)
{
	long long a = 1,b = 1,c = 1;
	for(int i = 0; i < v.size() && v[i] * v[i] <= x; ++i)
		if(x % v[i] == 0)
		{
			int p = v[i] % mod;
			int p2 = 1;
			int d = 0;
			while(x % v[i] == 0)
			{
				x /= v[i];
				p2 = (p2 * p) % mod;
				d++;
			}
			p2 = (p2 * p) % mod;
			p2--;
			if(p2 < 0)
				p2 += mod;
			p--;
			if(p < 0)
				p += mod;
			a *= d + 1;
			b = (b * p2) % mod;
			c = (c * p) % mod;
		}
	if(x != 1)
	{
		int p2,p,d;
		p = x % mod;
		p2 = (p * p) % mod;
		d = 1;
		p2--;
		if(p2 < 0)
			p2 += mod;
		p--;
		if(p < 0)
			p += mod;
		a *= d + 1;
		b = (b * p2) % mod;
		c = (c * p) % mod;
	}
	g << a << " " << (b * invers_modular(c)) % mod << '\n';
}