Cod sursa(job #1149990)

Utilizator serbanSlincu Serban serban Data 22 martie 2014 14:47:54
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <iostream>
#include <cstdio>
#include <cmath>

using namespace std;

int t,rad,k,suma,n;
int PR[78500];
long long nr,x,y,aux;
bool X[1000005];

int main()
{
    int i,j,z;
    FILE *f=fopen("ssnd.in","r");
    FILE *g=fopen("ssnd.out","w");
    fscanf(f,"%d",&t);
    PR[0]=1;
    n=1000000;
    for(i=2;i<=n;i++)
    {
        if(X[i]==false)
        {
            k++;
            PR[k]=i;
            for(j=2;j<=n/i;j++)
            {
                X[i*j]=true;
            }
        }
    }
    k=0;
    for(i=1;i<=t;i++)
    {
        fscanf(f,"%I64d",&x);
        y=x;
        j=0;
        rad=int(sqrt(y)+1);
        nr=1;
        suma=1;
        while(y>1 && PR[j]<=rad)
        {
            j++;
            k=0;
            aux=y;
            while(y%PR[j]==0)
                y/=PR[j],k++;
            if(k)
            {
                z=((aux/y*PR[j]-1)%9973);
                if(z==0) z++;
                if(suma==0)
                    suma=z;
                else suma*=z;
                z=(PR[j-1]%9973);
                if(z==0) z++;
                suma/=z;
                suma%=9973;
                nr*=(k+1);
            }
        }
        if(y>1)
            nr*=2,suma=suma*(y*y-1)/(y-1);
        fprintf(g,"%I64d %d\n",nr,suma);
    }
    return 0;
}