Cod sursa(job #862710)

Utilizator vladvaldezVlad Dimulescu vladvaldez Data 22 ianuarie 2013 21:07:09
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 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,b[180001],nr1,maxim,i,j;
long long div,div2,s,l,maxi,a[1001];

void ciur()
{
 int i,j;

  v[2]=0;
  nr1=1;
  b[nr1]=2;
  for(i=3;i<=maxim;i+=2)
    if (v[i]==0)
     {
      nr1++;
      b[nr1]=i;
      for(j=3;i*j<=maxim;j+=2)
       v[i*j]=1;
    }
}

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++)
   {
    nr=1;
    s=1;
    m=trunc(sqrt(a[i]));
    l=a[i];
    j=1;
    while(b[j]<=m && j<=nr1 && l!=1)
     {
     if (l%b[j]==0)
      {
       p=0;
       div=1;
       while(l%b[j]==0){
          p++;l=l/b[j];
          div=div*b[j];
       }
      div=div*b[j]-1;
      s=(s*(div/(b[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;
}