Cod sursa(job #1262722)

Utilizator EmplopiStefan Nitu Emplopi Data 13 noiembrie 2014 15:00:27
Problema Suma si numarul divizorilor Scor 40
Compilator c Status done
Runda Arhiva educationala Marime 1.37 kb
#include <stdio.h>
#include <stdlib.h>

int nrdiv, s, ciur[1000001];

void ciurul(){
	int i, j;
	ciur[0]=1;
	ciur[1]=1;
	for(i=2;i<1000001;i++){
		if(ciur[i]==0){
			for(j=i+i;j<1000001;j+=i)
				ciur[j]=1;
		}
	}
}

int putere(int n, int put){
    int p;
    p=1;
    while(put>0){
        p*=n;
        put--;
    }

    return p;
}

void factoriprimi(int n, int fp, int nrp){
    int fnou;
    //printf("   n=%d => %d^%d=%d\n", n, fp, nrp, putere(fp, nrp));
    //printf("        => nrdiv=%d, s=%d\n", nrdiv, s);
    if(n%fp==0)
        factoriprimi(n/fp, fp, nrp+1);
    else{
        if(fp<=n){
            nrdiv*=nrp+1;
            s*=(putere(fp, nrp+1)-1)/(fp-1);
            fnou=fp+1;
            while(ciur[fnou]!=0 && fnou<=n)
                fnou++;
            factoriprimi(n, fnou, 0);
        }
        if(n==1){
            nrdiv*=nrp+1;
            s*=(putere(fp, nrp+1)-1)/(fp-1);
            s%=9973;
        }
    }
}

int main(){
    FILE *fin, *fout;
    int t, i, nr;
    fin=fopen("ssnd.in", "r");
    fout=fopen("ssnd.out", "w");
    fscanf(fin, "%d", &t);
    for(i=0;i<t;i++){
        fscanf(fin, "%d", &nr);
        //printf("\n\n%d =>\n", nr);
        nrdiv=1;
        s=1;
        factoriprimi(nr, 2, 0);
        fprintf(fout, "%d %d\n", nrdiv, s);
    }
    fclose(fin);
    fclose(fout);

    return 0;
}