Cod sursa(job #580487)

Utilizator mihaipopa12Popa Mihai mihaipopa12 Data 13 aprilie 2011 09:15:42
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include<fstream>

#define MOD 9973
#define I64 long long

using namespace std;

ifstream f("ssnd.in");
ofstream g("ssnd.out");

int Pr[80000],k,i,j,t,sdiv,p,A[1005],B[1005]; 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 () {
	
	ciur();
	
	f >> t;
	
	while ( t-- ){
		
		f >> 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 + MOD) % MOD) * lgput (n-1,MOD-2)) % MOD; 
		}
		
		g << ndiv << " ";
		g << sdiv << "\n";
		
	}
	
	f.close();
	g.close();
	
	return 0;
}