Cod sursa(job #926054)

Utilizator taigi100Cazacu Robert taigi100 Data 24 martie 2013 22:06:50
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.97 kb
#include<stdio.h>

#define max 1000005
#define mod 9973

long long n;
int t,k,p[max];
bool vis[max];

 
void ciur()
{
	p[++k]=2;
	for(int i=3;i<max;i+=2)
		if(!vis[i])
		{
			p[++k]=i;
			for(int j=i+i;j<max;j+=i)
				vis[j]=1;
		}
}

int pow(int x,int p)
{
	int sol=1,a=x;

    for(int i=0; (1<<i) <= p; ++i)
	{	if( (1<<i)&p )
	      sol*=a;
	 a*=a;
	}
	return sol;
	      
}

void solve()
{
	scanf("%lld",&n);

	int nrd=1,suma=1;

	for(int i=1; i<=k && 1LL*p[i]*p[i]<=n;i++)
	{
		if( !(n%p[i]) )
		{
			int pr=0;
			while( ! ( n%p[i] ) )
			{
				n/=p[i];++pr;
			}
			nrd*=(pr+1);

			int p1 = (pow(p[i],pr+1)-1)%mod;
			int p2 = pow(p[i]-1,mod-2)%mod;
			suma=(((suma*p1)%mod)*p2)%mod;
		}
	}
	if(n>1)
	{
		nrd*=2;
		suma=(1LL*suma*(n+1)%mod);
	}
	printf("%d %d\n",nrd,suma);
}

int main()
{
 freopen("ssnd.in","r",stdin);
 freopen("ssnd.out","w",stdout);
 ciur();
 scanf("%d",&t);
 for(int i=1;i<=t;i++)
 solve();
}