Cod sursa(job #418123)

Utilizator irene_mFMI Irina Iancu irene_m Data 15 martie 2010 15:20:32
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.57 kb
#include <cstdio>
#include <cmath>
#define infile "ssnd.in"
#define outfile "ssnd.out"
#define MaxN 1000000
#define MaxM 1000
#define modulo 9973

bool a[MaxN];
long long N,X,K;
long long p[MaxM],r[MaxM],v[MaxM];
long long val[15],D[15],S[15],max;
int T;

void read()
{
      int i;
      scanf("%d",&T);
      for(i=1;i<=T;i++)
      {
            scanf("%lld",&val[i]);
            if(val[i]>max)
                  max=val[i];
      }
}

void prime()
{
      long long m=(long long)sqrt(max),i,j,n;
      a[1]=true;
      for(i=2;i*i<=MaxN;i++)
            if(a[i]==false)
                  for(j=2;j*i<=MaxN;j++)
                              a[i*j]=true;
}

void descompune(long long x,int l)
{
      long long m,i,R;
      i=2; D[l]=S[l]=1;
      while(x>1)
      {
            while(a[i]==true)
                  i++;
            R=0; m=i;
            while(x%i==0)
            {
                  R++;
                  x/=i;
                  m*=i;
            }
            D[l]*=(R+1);
            S[l]*=(m-1)/(i-1);
            S[l]%=modulo;
            i++;
      }

}

void solve()
{
      prime();
      int i;
      for(i=1;i<=T;i++)
            descompune(val[i],i);

}

void write()
{
      int i;
      for(i=1;i<=T;i++)
      {
            printf("%lld ",D[i]);
            printf("%lld\n",S[i]);
      }
}

int main()
{
      freopen(infile,"r",stdin);
      freopen(outfile,"w",stdout);

      read();
      solve();
      write();

      fclose(stdin);
      fclose(stdout);
      return 0;
}