Cod sursa(job #862544)

Utilizator vladvaldezVlad Dimulescu vladvaldez Data 22 ianuarie 2013 19:24:11
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include <stdio.h>
#include <math.h>
#include <bitset>

using namespace std;
FILE *f=fopen("ssnd.in","r");
FILE *g=fopen("ssnd.out","w");

//bitset <1000010> v;
int t,nr,p,m,v[1000010],nr1;
long long div,div2,s,x,l,maxi,a[1001],maxim,i,j;

void ciur()
{
    int i,j;
  v[1]=2;
  nr1=1;
  for(i=3;i<=1000;i+=2)
    if (v[i]==0)
    {
        nr1++;
        v[nr1]=i;
      for(j=i*i;j<=1000000;j+=2*i)
       v[j]=1;
    }
   for(i=1001;i<=1000000;i+=2)
   if (v[i]==0)
    {
       nr1++;
       v[nr1]=i;
    }
}

int main()
{
 fscanf(f,"%d",&t);
 for(i=1;i<=t;i++){
 fscanf(f,"%lld",&a[i]);
 if (a[i]>maxi)maxi=a[i];
 }
 maxim=trunc(sqrt(maxi));
 ciur();
 for(i=1;i<=t;i++)
 {
  x=a[i];
  nr=1;
  s=1;
  m=trunc(sqrt(x));
  l=x;
   j=1;
   while(v[j]<=m && j<=nr1 && l!=1)
    {
    if (x%v[j]==0)
    {
      p=0;
      div=1;
      while(l%v[j]==0){
          p++;l=l/v[j];
          div=div*v[j];
      }

      div=div*v[j]-1;
      s=(s*(div/(v[j]-1)))%9973;
        nr=nr*(p+1);

    }
    j++;
 }
     if (l!=1){nr=nr*2;s=(s*(l*l-1)/(l-1))%9973;}
  fprintf(g,"%d %d\n",nr,s);
 }
fclose(g);
return 0;
}