Cod sursa(job #580470)

Utilizator mihaipopa12Popa Mihai mihaipopa12 Data 13 aprilie 2011 08:58:38
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include<stdio.h>

#define MOD 9973
#define I64 long long

FILE*f=fopen("ssnd.in","r");
FILE*g=fopen("ssnd.out","w");

int Pr[80000],k,i,j,t,sdiv,p; I64 n,ndiv;
char Ciur[1000005];

inline void ciur () {
	
	Pr[++k] = 2;
	for ( i = 3 ; i <= 1000003 ; i += 2 ){
		if ( !Ciur[i] ){
			for ( j = i + i + i ; j <= 1000003 ; j += (i<<1) ){
				Ciur[j] = 1;
			}
			Pr[++k] = i;
		}
	}
	
}

inline int lgput ( I64 a, int b ){
	I64 s = a; int rez = 1;
	
	while ( b ){
		if ( b & 1 ){
			rez = (1LL*rez * s) % MOD;
		}
		
		s = (1LL*s * s) % MOD;
		
		b = b >> 1;
	}
	
	return rez;
	
}

int main () {
	
	fscanf(f,"%d",&t);
	
	ciur();
	
	while ( t-- ){
		
		fscanf(f,"%lld",&n);
		
		ndiv = sdiv = 1;
		
		for ( i = 1 ; Pr[i] * Pr[i] <= n && i <= k && n > 1 ; ++i ){
			p = 0;
			if ( !(n % Pr[i] ) ){
				while ( !(n % Pr[i]) ){
					++p;
					n /= Pr[i];
				}
				ndiv = 1LL*ndiv * (p + 1);
				sdiv = (1LL*sdiv * 1LL*(lgput(Pr[i],p+1) - 1) * 1LL*lgput((Pr[i]-1),MOD-2)) % MOD;
			}
			
		}
		
		if ( n > 1 ){
			ndiv = (1LL * ndiv) << 1;
			sdiv = (sdiv * 1LL*((lgput(n,2) - 1)) * lgput (n-1,MOD-2)) % MOD; 
		}
		
		fprintf(g,"%lld ",ndiv);
		fprintf(g,"%d\n",sdiv);
		
	}
	
	fclose(f);
	fclose(g);
	
	return 0;
}