Cod sursa(job #1000097)

Utilizator teoionescuIonescu Teodor teoionescu Data 21 septembrie 2013 23:20:34
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include<fstream>
using namespace std;
ifstream in("ssnd.in");
ofstream out("ssnd.out");
const int MOD = 9973;
int prim[100000];
void ciur(){
	int i,j;
	const int MAXL = 1000000;
	char k[MAXL+2];
	for(i=1;i<=MAXL;i++) k[i]=1;
	for(i=2;i<=MAXL;i++){
		if(k[i]==1){
			prim[++prim[0]]=i;
			for(j=i+i;j<=MAXL;j+=i) k[j]=0;
		}
	}
}
long long get(long long P,long long D){
	long long p=1;
	for(int i=1;i<=D+1;i++){
		p*=P;
		p%=MOD;
	}
	p-=1;
	long long pp=1;
	for(int i=1;i<=MOD-2;i++){
		pp*=(P-1);
		pp%=MOD;
	}
	return (p*pp)%MOD;
}
void proc(long long P[],long long D[],int L){
	long long nr=1,sum=1;
	for(int i=1;i<=L;i++){
		nr*=(D[i]+1);
		sum*=get(P[i],D[i]);
		sum%=MOD;
	}
	out<<nr<<' '<<sum<<'\n';
}
int main(){
	ciur();
	int i,t;
	long long n,p[20],d[20];
	in>>t;
	for(;t;--t){
		in>>n;
		int l=0;
		for(i=1;prim[i]*prim[i]<=n;i++){
			if(n%prim[i]==0){
				l++;
				p[l]=prim[i];
				int e=0;
				while(n%prim[i]==0){
					e++;
					n/=prim[i];
				}
				d[l]=e;
			}
		}
		if(n>1){
			l++;
			p[l]=n;
			d[l]=1;
		}
		proc(p,d,l);
	}
	return 0;
}