Cod sursa(job #582529)

Utilizator informatician28Andrei Dinu informatician28 Data 15 aprilie 2011 14:58:49
Problema Suma si numarul divizorilor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.02 kb
#include<fstream>   
using namespace std;   
ifstream f("ssnd.in");   
ofstream g("ssnd.out");   
long long prim[9999999],i,j,maxim,suma,putere,s,q;  
int v[1001],k,expo;
void ciur() 
{for(i=2;i<=maxim;i++) 
	prim[i]=1;
for(i=2;i*i<=maxim;i++)
	if(prim[i]) 
		for(j=i*i;j<=maxim;j+=i)
			prim[j]=0;
}
long long ridicare(int baza,int expo)
{int k;
putere=1; 
	for(k=1;k<=expo;k++)	putere*=baza;	
return putere; 
}
long long suma1(int baza1,int expo1)
{s=0;
do{
	s+=ridicare(baza1,--expo1);}while(expo1!=0);
return s; 
}
int main()   
{ int t,fm,nrd,ok; 
f>>t;    
for(j=1;j<=t;j++) 
{f>>v[j]; if(maxim<v[j]) maxim=v[j];} ciur(); 
for(j=1;j<=t;j++) 
{  nrd=1; ok=0; suma=1;
if(v[j]==0) {nrd*=0; suma*=0;} 
for(i=1;i<=v[j]/2;i++) 
 {fm=0;
	 if(v[j]%i==0 && prim[i]) 
      {while(v[j]%i==0) {v[j]/=i; fm++;}
nrd*=(fm+1); suma*=suma1(i,(fm+1)); 
      }
	  
	  if(prim[v[j]] && ok==0) {fm=ok=1;  nrd*=(fm+1); suma*=suma1(v[j],(fm+1));
	                 }
	   
 }
g<<nrd<<" "<<suma<<'\n';} return 0;

}