Cod sursa(job #650873)

Utilizator FIIAilincaiPascBogdan Valentin FIIAilincaiPasc Data 19 decembrie 2011 02:27:47
Problema Suma si numarul divizorilor Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 1.05 kb
#include <stdio.h>
#define NMAX 1000000

long ciur[NMAX];
long viz[NMAX];

void eratostene()
{
  int j,i;
  for(i=3;i<=NMAX;i+=2)
	{
    if(viz[i]==0)
		{
		  ciur[++ciur[0]]=i;
		  for(j=i+i+i;j<=NMAX;j+=2*i)
			 viz[j]=1;
		}
	}
}

int main()
{
  FILE *in,*out;
  long n, x, i,nr_div,suma,aux_div,p;

  in=fopen("ssnd.in","r");
  out=fopen("ssnd.out","w");
  ciur[0]=1;
  ciur[1]=2;
  eratostene();

  fscanf(in,"%ld",&n);
  for(i=1;i<=n;i++)
    {
      fscanf(in,"%ld",&x);
	  nr_div=suma=1;
      for(i=1;ciur[i]*ciur[i]<=x;i++)
      {
        if(x%ciur[i]==0)
        {
          aux_div=1;
          p=ciur[i];
          while(x%ciur[i]==0)
          {
            aux_div++;
            p=p*ciur[i];
            x/=ciur[i];
          }
          nr_div*=aux_div;
          suma*=(p-1)/(ciur[i]-1)%9973;
        }
      }
      if(x!=1)
      {
        suma*=(x*x-1)/(x-1)%9973;
        nr_div*=2;
      }
      fprintf(out,"%ld %ld\n",nr_div,suma%9973);  
    }
  fclose(in);
  fclose(out);
  return 0;
}