Cod sursa(job #681306)

Utilizator d.andreiDiaconeasa Andrei d.andrei Data 16 februarie 2012 21:07:58
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 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;
int nrd,sumd;
int viz[lim];
int P[lim];


int put(int x, int p) 
{
	int rez=1;
	x%=mod;
	for(;p;p>>=1){
		if(p&1)
			rez=(rez*x)%mod;
		x=(x*x)%mod;
	}
	return rez;
}


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 && 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("%d %d\n", nrd,sumd); 
	}
		
	return 0;
}