Cod sursa(job #772747)

Utilizator AndreeaNNedelcu Andreea AndreeaN Data 30 iulie 2012 17:33:28
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include<stdio.h>
FILE *f=fopen("ssnd.in","r"),*g=fopen("ssnd.out","w");
long int t,prime[80001],nrpr=0;

void ciur(){
long int i,j;
bool p[1000001];
	for(i=2; i<=1000001; i++){
        if(p[i]==0){
			nrpr++; prime[nrpr]=i;
            //nr++;
            for(j=i+i; j<=1000001; j=j+i){
                p[j]=1;
            }
        }
    }
	/*for(i=1; i<=29; i++){
		printf("%ld ",prime[i]);
	}*/
}

void afla_divizorii(long int n){
long int i=1,nrd=1,p=1,put=0,s=1,n1=n;

	while(n!=1 && i<=nrpr && prime[i]*prime[i]<=n1){
		if(n%prime[i]==0){
			//printf("divizorul %ld\n",prime[i]);
			put=0;//puterea la care apare factorul prime[i]
			p=1;  //produsul celor put+1 factori
			while(n%prime[i]==0){
				put++;
				p=p*prime[i];
				n=n/prime[i];
				//printf("%ld %ld %ld\n",put,p,n);
			}
			p=p*prime[i];
			nrd*=put+1;
			s=(s*(p-1)/(prime[i]-1))%9973;
		}
		i++;
	}
	if(n!=1){
		nrd=2;
		s=(n*n-1)/(n-1);
	}
	
	fprintf(g,"%ld %ld\n",nrd,s%9973);
}


void read(){
long int i,n;
	fscanf(f,"%ld\n",&t);
	for(i=1; i<=t; i++){
		fscanf(f,"%ld\n",&n);
		afla_divizorii(n);
	}
}

int main(){
	ciur();
	read();
return 0;
}