Cod sursa(job #2087581)

Utilizator shantih1Alex S Hill shantih1 Data 13 decembrie 2017 20:51:15
Problema Suma si numarul divizorilor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include <iostream>
#include <fstream>
#define ll long long
#define crmx 1000000
#define mod 9973

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

ll n, i, j, t, np, dv[80000], NR, SUM, MARE, x, y, h;
bool b[1000010];

void invmod (ll a, ll b, ll &x, ll &y)
{
	if (b == 0)
	{   x = 1;  y = 0;  }
	else
	{
		ll x0, y0;
		invmod (b, a%b, x0, y0);
		x = y0;
		y = x0-(a/b)*y0;
	}
}

int main () {
 
	for (i = 2; i <= crmx; i++)
		if (b[i] == 0)
		{
			np++;   dv[np] = i;
			for (j = 2; j*i <= crmx; j++)
				b[i*j] = 1;
		}
 
	fin >> t;
	while (t)
	{
		fin >> n;
		NR = 1;
		MARE = 1;
		ll d = 1;
		while (n != 1 && d <= np)
		{
			ll pt = 0;
			while (n%dv[d] == 0)
			{   pt++;   n /= dv[d];   }
			if (pt != 0)
			{
				SUM = 1;
				NR *= pt+1;
				NR %= mod;
				for (i = 1; i <= pt+1; i++)
					SUM = (SUM*dv[d])%mod;
				SUM--;
				invmod(dv[d]-1, mod, x, y);
				if (x < 0)  x += (-x/mod)*mod+mod;
				SUM = (SUM*x)%mod;
				MARE *= SUM;
			}
			d++;
		}
		if (n != 1)
		{
			SUM = (n*n)%mod;
			NR = (NR*2)%mod;
			SUM--;
			invmod(n-1, mod, x, y);
			if (x < 0)	x += (-x/mod)*mod+mod;
			SUM = (SUM*x)%mod;
			MARE *= SUM;
		}
		fout << NR << " " << MARE << "\n";
		t--;
	}
}