Cod sursa(job #799879)

Utilizator alexandru70Ungurianu Alexandru alexandru70 Data 20 octombrie 2012 12:04:14
Problema Suma si numarul divizorilor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <fstream>

#define LL long long
#define MOD 9973
using namespace std;
int t,nr = 1,k;
LL n;

ifstream f("ssnd.in");
ofstream g("ssnd.out");

const int MAXSIZE = 1000001;
int r [80000];
LL p[80000];
int d[80000];
char w [MAXSIZE]; //p[i] == 0 if i is prime

inline int pow(int n,int k)
{
  if(k == 1)
    return n;
  else
  {
    long long v = pow(n,k/2)%MOD;
    if(k%2)
      return (n*(v*v))%MOD;
    else
      return (v*v)%MOD;
  }
}

inline void ciur()
{	int i, j;
	for (i = 2; i <= 500000; ++i)
		if (w[i] == 0)
			for (j = i + i; j <= 1000000; j += i) w[j] = 1;
	r[1] = 2;
	for( int i = 3; i <= 1000000; i+=2 )
	{
		if(!w[i]) //cout << i << ' ',
			r[++nr] = i;
	}
}

inline void desc( LL n , int &k )
{
	k = 0;
	int i = 1;
	while(n > 1)
	{	if(!(n%r[i]))
		{
			p[++k] = r[i]; d[k] = 0;
			while(!(n%r[i]))
			{	d[k]++;
				n/=r[i];
			}
		}
		i++;
	}
}

inline int nrDiv(int k)
{
    int divs = (d[1] + 1)%MOD;
    for( int i = 2; i <=k; i++ )
    {
        divs *= (d[i] + 1)%MOD;
    }
    return divs%MOD;
}

inline int sDivs(int k)
{
    int power = pow(p[1],d[1]+1);
    int s = (power - 1)/(p[1]-1)%MOD;
    for(int i = 2; i <=k; i++)
    {
        power = pow(p[i],d[i]+1);
        s *= (power - 1)/(p[i]-1)%MOD;
    }
    return s;
}

int main()
{
	ciur();
	f >> t;
	while(t--)
	{
		f >> n;
		desc( n,k );
		g << nrDiv(k);
		g << ' ' << sDivs(k);
		g << '\n';
	}
	return 0;
}