Cod sursa(job #670865)

Utilizator andreidanAndrei Dan andreidan Data 30 ianuarie 2012 11:58:47
Problema Suma si numarul divizorilor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.12 kb
#include <cstdio>
#include <bitset>



using namespace std;
 
bitset <5000000> ar;

unsigned long long prm[10000000];
unsigned long long a[10000000];
unsigned long long cif[10000000];
unsigned long long pu[10000000];
 
int main(){
       unsigned long long n,t,i,j,k,s,cp,cn,l,su,v,cnt=1;
        
        freopen("ssnd.in","r",stdin);
        freopen("ssnd.out","w",stdout);
        
        scanf("%lld",&t);
		
		
		
		for(i=2;i*i<=500000;++i){
		if(ar[i]==0){
			prm[cnt++]=i;
			for(j=i*i;j<=500000;j=j+i){
				ar[j]=1;
			}
		}
		}
		a[1]=1;
        
		
        for(k=1;k<=t;++k){
                scanf("%lld", &n);
                s=0;
                cn=n;
                cp=0;
                j=0;
                l=0;
                su=0;
                v=0;
                
                for(i=1;cn>1;++i){
					
                        cp=0;
                        pu[v]=prm[i];
                        while(cn%prm[i]==0&&prm[i]>1){
                        
                                        cp++;
                                        cn=cn/prm[i];
                                        if(prm[i]!=cif[l-1]) cif[l++]=prm[i];
                                        pu[v]=pu[v]*prm[i];
                                        
                                        
                                
                                
                        }
                        if(cp>0) {
							a[j++]=cp;
							
							v++;
							
						}
                
                        
                }
				
                
				
				
                cp=1;
                for(i=0;i<j;++i){
                        cp=cp*(a[i]+1);
                        
                }
                
                su=1;
                for(i=0;i<j;++i){
                        su=su*((pu[i]-1)/(cif[i]-1));
                        su=su%9973;
                }
				
				printf("%lld %lld\n", cp, su);
				
				for(i=0;i<=j;++i){
					cif[i]=0;
					pu[i]=0;
					a[i]=0;
				}
                                
                
        }
   }