Cod sursa(job #2099733)

Utilizator Fanika123Tanasa Stefan Fanika123 Data 4 ianuarie 2018 17:11:11
Problema Suma si numarul divizorilor Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include <bits/stdc++.h>
#define in "ssnd.in"
#define out "ssnd.out"
#define oo 9973
#define nmax 1000050
using namespace std;
ifstream fin(in);
ofstream fout(out);

int t;
int n;
bitset <nmax> ciur;
int prime[nmax],k;

void Prim()
{
    int i,j;

    ciur[0] = 1;
    ciur[1] = 1;
    for (i = 4; i <= nmax; i += 2)
        ciur[i] = 1;

    for (i = 3; i*i <= nmax; i += 2)
        if (ciur[i] == 0)
            for (j = i*i; j <= nmax; j+= (2*i))
                ciur[j] = 1;

    k = 1;
    prime[1] = 2;
    for (i = 3; i < nmax; i += 2)
        if (ciur[i] == 0) prime[++k] = i;
}

long long RidLog(long long x, int n)
{
	long long p = 1;

	while (n > 0)
	{
		if (n & 1)
		{
			p *= x;
			n--;
		}
		x = x * x;
		n >>= 1 ;
	}
	return p;
}

void Ssnd(int n)
{
    int i,p;
    long long sum = 1, nrdiv = 1;

    for (i = 1; i <= n; i++)
        if (n % prime[i] == 0)
        {
            p = 0;
            while (n % prime[i] == 0)
            {
                p++;
                n /= prime[i];
            }
            nrdiv = nrdiv * (p+1);
            sum = sum * (RidLog(prime[i],p+1) - 1) / (prime[i] - 1) % oo;
        }

     fout << nrdiv << " " << sum % oo  << "\n";
}

int main()
{
    Prim();
    fin >> t;
    while (t--)
    {
        fin >> n;
        Ssnd(n);
    }

    fin.close();
    fout.close();
    return 0;
}