Cod sursa(job #797437)

Utilizator radustn92Radu Stancu radustn92 Data 14 octombrie 2012 01:32:28
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include <stdio.h>
#include <bitset>
#define ll long long
#define NMAX 1000005
#define MOD 9973
using namespace std;
int t,A[NMAX],r,rez;
ll n,cnt_divs;
bitset <NMAX> marc;
void precompute()
{
	int i,j;
	for (i=2; i*i<NMAX; i++)
		if (!marc[i])
			for (j=i*i; j<NMAX; j+=i)
				marc[j]=1;
	for (i=2; i<NMAX; i++)
		if (!marc[i])
			A[++r]=i;
}
int lgput(int baza,int exp)
{
	int act=1;
	while (exp)
	{
		if (exp & 1)
			act=(act*baza)%MOD;
		baza=(baza*baza)%MOD;
		exp>>=1;
	}
	return act;
}
void prel(ll val,int exp)
{
	int act;
	act=lgput(val%MOD,exp+1)-1;
	if (act<0) act+=MOD;
	
	act=(act*lgput((val-1)%MOD,MOD-2))%MOD;
	rez=(rez*act)%MOD;
}
void desc()
{
	int i,exp;
	rez=1; cnt_divs=1;
	for (i=1; (ll)A[i]*A[i]<=n; i++)
		if (n % A[i]==0)
		{
			exp=0;
			while (n % A[i]==0)
				n/=A[i],exp++;
			cnt_divs*=exp+1;
		
			prel((ll)A[i],exp);
		}
	if (n!=1)
		prel(n,1),cnt_divs*=2;
}
int main()
{
	freopen("ssnd.in","r",stdin);
	freopen("ssnd.out","w",stdout);
	precompute();
	scanf("%d",&t);
	while (t--)
	{
		scanf("%lld",&n);
		desc();
		printf("%lld %d\n",cnt_divs,rez);
	}
	return 0;
}