Cod sursa(job #582760)

Utilizator informatician28Andrei Dinu informatician28 Data 15 aprilie 2011 20:57:34
Problema Suma si numarul divizorilor Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 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%9973<<'\n';} return 0; 
 
 
}