Cod sursa(job #647301)

Utilizator okros_alexandruOkros Alexandru okros_alexandru Data 11 decembrie 2011 13:31:29
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.97 kb
#include<fstream>
#define MOD 9973
#define NMAX 1000001
using namespace std;
int prim[NMAX/2],n,nr_prime;
bool viz[NMAX+1000];

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

int exp_log(int a,int p) {
	int mask=1,sol=1;
	a%=MOD;
	while(mask<=p) {
		if(mask&p)
			sol=(sol*a)%MOD;
		a=(a*a)%MOD;
		mask*=2;
		}
	return sol;
}
void rez(long long x) {
	int i,k,div=1,sum=1;
	for(i=1;1LL*prim[i]*prim[i]<=x&&i<=nr_prime;i++)
		if(x%prim[i]==0) {
			k=1;
			while(x%prim[i]==0) {
				k++;
				x/=prim[i];
				}
			div*=k;
			sum=(sum*(exp_log(prim[i],k)-1))%MOD;
			sum=(sum*(exp_log(prim[i]-1,MOD-2)))%MOD;
			}
	if(x>1) {
		div*=2;
		sum=(sum*(x+1))%MOD;
		}
	out<<div<<' '<<sum%MOD<<'\n';
}
void ciur() {
	int i,j;
	prim[1]=2;
	nr_prime=1;
	for(i=3;i<NMAX;i+=2)
		if(!viz[i]) {
			prim[++nr_prime]=i;
			for(j=3*i;j<NMAX;j+=(i<<1))
				viz[j]=1;
			}
}
int main() {
	int i;
	long long x;
	ciur();
	in>>n;
	for(i=0;i<n;i++) {
		in>>x;
		rez(x);
		}
	in.close();
	out.close();
	return 0;
}