Cod sursa(job #494468)

Utilizator Adela_BaciuAdela Baciu Adela_Baciu Data 21 octombrie 2010 18:46:07
Problema Suma divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.06 kb
#include<cstdio>
const int r = 9973; 
const int N = 1<<20; 
bool c[N]; 
int pr[N],np; 
void ciur() 
{ 
	int i,j;     
	for(i=2;i*i<N;++i)   
		if(!c[i]) 
			for(j=i*i;j<N;j+=i)         
				c[j]=true; 
	for(i=2;i<N;++i) 
		if(!c[i]) 
			pr[++np] = i; 
} 
long long putere(long long a,int n) 
{ 
	long long p = 1; 
	while(n != 0)     
	{ 
		if(n&1 != 0)             
			p *= a;     
			a *= a;         
			n >>= 1;   
	} 
	return p; 
} 
void calcul(long long n)
{
	int i,pow,nr = 1;
	long long s = 1,p;
	for(i=1 ; (long long)pr[i]*pr[i] <= n ; ++i)
	{
		if(n%pr[i] != 0)
			continue;
		for(pow=0 ; n%pr[i]==0 ; n/=pr[i])
		{
			++pow;
		}
		p = putere(pr[i],pow + 1);
		s *= (long long)(p - 1) / (pr[i] - 1);
		s %= r;
		nr *= (pow + 1);
	}
	if(n != 1)
	{
		s *= n + 1;
		nr <<= 1;
	}
	s %= r;
	printf("%d %d\n",nr,(int)s);
}
int main()
{
	freopen("ssnd.in","r",stdin);
	freopen("ssnd.out","w",stdout);
	int t;
	ciur();
	long long n;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%lld",&n);
		calcul(n);
	}
	return 0;
}