Cod sursa(job #487906)

Utilizator brainwashed20Alexandru Gherghe brainwashed20 Data 26 septembrie 2010 20:36:33
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
#include<cstdio>
#include<cstring>

using namespace std;

const int DIM = 1000005;

const int MOD = 9973;

long long N;
int T, K, P[DIM];
char ciur[DIM];

void erast() {
	int i, j;
	for(i=2; i<DIM; i++) {
		if(ciur[i]==0) {
			P[++K]=i;
			for(j=i*2; j<DIM; j+=i) 
				ciur[j]=1;
		}
	}
}

inline int pow(int x, int p) {
	int sol=1;
	x%=MOD;
	for(; p; p/=2) {
		if(p%2==1) 
			sol*=x, sol%=MOD;
		x*=x, x%=MOD;
	}
	return sol;
}

void solve(long long N) {
	int	i, p1, p2, nd=1, sd=1, cnt;

	for(i=1; i<=K && P[i]*P[i]<=N; i++) {
		if(N%P[i]) 
			continue;
		cnt=0;
		while(N%P[i]==0) {
			N/=P[i];
			++cnt;
		}
		nd*=(cnt+1);
		p1=(pow(P[i],cnt+1)-1)%MOD;
		p2=pow(P[i]-1,MOD-2)%MOD;
		sd =((sd*p1)%MOD)*p2%MOD;
	}

	if(N>1) {
		nd*=2;
		sd=sd*(N+1)%MOD;
	}

	printf("%d %d\n",nd,sd);
}

int main() {
	freopen("ssnd.in","r",stdin);
	freopen("ssnd.out","w",stdout);
	
	erast();
	
	scanf("%d",&T);
	while(T--) {
		scanf("%lld",&N);
		solve(N);
	}
	
	return 0;
}