Cod sursa(job #879589)

Utilizator roots4Irimia Alexandru Gabriel roots4 Data 15 februarie 2013 17:36:58
Problema Suma si numarul divizorilor Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include<fstream>
#include<math.h>
#include<string.h>
#define mod 9973
#define max_n 100010
#define max_s 80
using namespace std;

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

int T,nr,i,d,k,j,x,y,nr_d,s_d;
char V[max_n];
long long p1,p2;
int Prim[max_n],Nr_d[max_s],Div[max_s];
double rad;

long long power(int x , int y){
	
	long long p=x,sol=1;
	
	while(y){
		if(y%2==1)
			sol*=p;
		p*=p;;
		y>>=1;
	}
	
	return sol;
}


void ciur(){
	
	Prim[++k]=2;
	
	for(i=3 ; i<=max_n ; i+=2)
		if(V[i]==0){
			Prim[++k]=i;
			for(j=2*i ; j<=max_n ; j+=i)
				V[i]=1;
		}
	
}

int main(){
	
	f>>T;
	
	ciur();
	
	while(T--){
		f>>nr;
		
		rad=sqrt(nr);
		
		memset(Nr_d,0,sizeof(Nr_d));d=0;nr_d=1;s_d=1;
		
		for(i=1 ; i<=k && Prim[i]<=rad ; i++)
			if(nr%Prim[i]==0){
				Div[++d]=Prim[i];
				while(nr%Prim[i]==0){
					Nr_d[d]++;
					nr/=Prim[i];
				}
			}
		
		if(nr!=1)
			Div[++d]=nr,Nr_d[d]++;
		
		for(i=1 ; i<=d ; i++){
			nr_d*=(Nr_d[i]+1);
			
			p1=power(Div[i],Nr_d[i]+1)-1;
			p2=Div[i]-1;
		
			s_d*=(p1/p2)%mod;
			s_d%=mod;
		}
		g<<nr_d<<" "<<s_d<<"\n";
	}
	
	
	return 0;
}