Cod sursa(job #629289)

Utilizator sunt_emoSunt emo sunt_emo Data 3 noiembrie 2011 01:48:05
Problema Suma si numarul divizorilor Scor 70
Compilator c Status done
Runda Arhiva educationala Marime 1.16 kb
#include <stdio.h>
#define N 1000000

char l[N+10];
int pr[79000],i,k=1;
long long j,np=1,m,n1,n2;
short t,d,s;

int main () {
    freopen ("ssnd.in","r",stdin);
    freopen ("ssnd.out","w",stdout);
    pr[0]=2;
    for (i=1; ((i*i)<<1)+(i<<1)<=N; i++) {
        pr[np++]=(i<<1)+1;
        if ((l[i>>3]&(1<<(i&7)))==0)
            for (j=((i*i)<<1)+(i<<1); (j<<1)+1<=N; j+=(i<<1)+1) l[j>>3]|=(1<<(j&7));

    }
    for (; (i<<1)+1<=N; ++i)
        if ((l[i>>3] & (1<<(i&7)))==0)
            pr[np++]=(i<<1)+1;
    scanf ("%hd",&t);
    for (i=0; i<t; i++) {
        scanf ("%lld",&n1);
        s=d=1;
        for (m=0; pr[m]*pr[m]<=n1; m++) {
            if (!(n1%pr[m])) {
                k=1;
                n2=pr[m];
                while (!(n1%pr[m])) {
                    n1/=pr[m];
                    k++;
                    n2*=pr[m];
                }
                d*=k;
                s=s*(n2-1)/(pr[m]-1)%9973;
            }
        }
        if (n1!=1) {
            d+=d;
            s=s*(n1*n1-1)/(n1-1)%9973;
        }
        printf ("%hd %hd\n",d,s);
    }
    fclose (stdin);
    fclose (stdout);
    return 0;
}