Cod sursa(job #448188)

Utilizator Alexa_ioana_14Antoche Ioana Alexandra Alexa_ioana_14 Data 3 mai 2010 08:55:54
Problema Suma si numarul divizorilor Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include<cstdio>
#include<bitset>
#include<vector>
using namespace std;
#define NM 1000000
#define LL unsigned long long
#define pb push_back
#define MOD 9973
vector<int>prim;
LL n,nrd,sum;
size_t g;
bitset <NM> viz;
void ciur()
{
	int d=2;
	viz[0]=viz[1]=0;
	while (d*d<NM)
	{
		if (viz[d])
		{
			++d;
			continue;
		}
		for (int i=d*d; i<NM; i+=d)
			viz[i]=1;
		prim.pb(d);
		++d;
	}
	for (int i=d; i<NM; ++i)
		if (!viz[i])
			prim.pb(i);
	g=prim.size();
}
void divizori(LL x)
{
	int num;
	nrd=1;
	sum=1;
	for (int i=0; (LL)prim[i]*prim[i]<=x&&i<g; ++i)
	{
		if (x%prim[i]!=0)
			continue;
		num=0;
		LL p=1;
		while (x%prim[i]==0)
		{
			++num;
			x/=prim[i];
			p*=prim[i];
		}
		nrd=nrd*(num+1);
		sum=(((p*prim[i]-1)/(prim[i]-1))%MOD)*sum%MOD;
	}
	if (x-1)
	{
		nrd=nrd*2;
		sum=(x*x-1)/(x-1)%MOD*sum%MOD;
	}
}
int main()
{
	freopen("ssnd.in","r",stdin);
	freopen("ssnd.out","w",stdout);
	ciur();
	short int t;
	scanf("%hd",&t);
	while (t--)
	{
		scanf("%lld",&n);
		if (!viz[n])
		{
			printf("2 %lld\n",n+1);
			continue;
		}
		divizori(n);
		printf("%lld %lld\n",nrd,sum);
	}
	return 0;
}