Cod sursa(job #681296)

Utilizator d.andreiDiaconeasa Andrei d.andrei Data 16 februarie 2012 20:55:55
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <cstdio>

#define file_in "ssnd.in"
#define file_out "ssnd.out"

#define ll long long
#define mod 9973

#define lim 1000100

int Q,d,e,nr;
long long N,nrd,sumd;
int viz[lim];
int P[lim];

int put(int A, int B){
	
	if (B==0)
		return 1;
	if (B%2==0){
		int X=put(A,B/2);
		return ((X%mod)*(X%mod))%mod;
	}
	else{
		int X=put(A,B/2);
		return ((((X%mod)*(X%mod))%mod)*A%mod)%mod;
	}
}


void ciur(){
	
	int i,j;
	for (i=2;i<=lim;++i)
		 if (!viz[i]){
			 P[++nr]=i;
			 for (j=i+i;j<=lim;j+=i)
				  viz[j]=1;
		 }
}

int main(){
	int i;
	ciur();
	
	freopen(file_in,"r",stdin);
	freopen(file_out,"w",stdout);
	
	scanf("%d", &Q);
	
	while(Q--){
		
		scanf("%lld", &N);
		
		
		nrd=sumd=1;
		
		for (i=1;i<=nr && i<=1LL*P[i]*P[i]<=N;++i){
			 if (N%P[i]) 
				 continue;
			 e=0;
			 while(N%P[i]==0){
				 e++;
				 N/=P[i];
			 }
			 if (e>0){
			 nrd*=(e+1);
			 int p1=(put(P[i],e+1)-1)%mod;
			 int p2=put(P[i]-1,mod-2)%mod;
			 sumd=(((sumd*p1)%mod)*p2)%mod;
			 }
		}
		if (N!=1){
			nrd*=2;
			sumd=(1LL*sumd*(N+1))%mod;
			}
	    printf("%lld %lld\n", nrd,sumd); 
	}
		
	return 0;
}