Cod sursa(job #1000104)

Utilizator teoionescuIonescu Teodor teoionescu Data 21 septembrie 2013 23:33:11
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 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 power(long long b, long long e)
{
    long long res=1;
    while(e)
    {
        if(e&1) res*=b;
        b*=b;
        e>>=1;
    }
    return res;
}
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 = ( sum*( power(P[i],D[i]+1)-1) / (P[i]-1) ) %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;
}