Cod sursa(job #629173)

Utilizator sunt_emoSunt emo sunt_emo Data 2 noiembrie 2011 19:43:00
Problema Suma si numarul divizorilor Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 1.07 kb
#include <stdio.h>
#define N 1000000

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

int main ()
{
    FILE * in=fopen ("ssnd.in","r");
    FILE * out=fopen ("ssnd.out","w");
    for (i=1; i<=N; i++) p[i+1]=n[i-1]=i;
    for (k=2; k*k<N; k=n[k])
        for (j=2*k; j<N; j+=k) {
            n[p[j]]=(n[p[j]]>n[j] ? n[p[j]] : n[j]);
            p[n[j]]=(p[n[j]]<p[j] ? p[n[j]] : p[j]);
        }
    for (k=2; k<N; k=n[k]) pr[np++]=k;
    fscanf (in,"%hd",&t);
    for (i=0; i<t; i++)
    {
        fscanf (in,"%lld",&n1);
        s=d=1;
        for (m=0; p[m]*p[m]<=n1; m++)
        {
            j=pr[m];
            if (!(n1%j))
            {
                n2=n1;
                k=1;
                while (!((n1=n1/j)%j)) k++;
                d*=(k+1);
                s=s*(n2/n1*j-1)/(j-1)%9973;
            }
        }
        if (n1!=1)
        {
            d*=2;
            s=s*(n1*n1-1)/(n1-1)%9973;
        }
        fprintf (out,"%hd %hd\n",d,s);
    }
    fclose (in);
    fclose (out);
    return 0;
}