Cod sursa(job #1293562)

Utilizator badea_adi1999Badea Adrian Catalin badea_adi1999 Data 16 decembrie 2014 01:24:54
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include <cstdio>
#include <fstream>
#define prim 9973
#define maxim 1000000
using namespace std;
FILE *f=fopen("ssnd.in","r");
FILE *g=fopen("ssnd.out","w");
long long n;
int8_t car[maxim+5];
int pr[100000],nrpr;
int d[100],e[100];

long long put(int t,int k)
{long long tt=1;
while (k!=0) {tt*=t;
              k--;}
return tt;
}
void ciur()
{int i,j;
car[2]=1;
for (i=3;i<=maxim;i+=2) car[i]=1;
for (i=3;i*i<=maxim;i+=2) if (car[i]==1) for (j=i*i;j<=maxim;j+=i) car[j]=0;
for (i=2;i<=maxim;i++) if (car[i]==1) pr[++nrpr]=i;

}
void rez()
{int i=1,nr=0;
fscanf(f,"%lld",&n);

while (n!=1)
        {if (n%pr[i]==0) {n/=pr[i];
                          d[++nr]=pr[i];
                          e[nr]=1;
                          while (n%pr[i]==0) {n/=pr[i];
                                              e[nr]++;}
                          }
            else if (pr[i]*pr[i]>n)
                     {d[++nr]=n;
                      e[nr]=1;
                      n=1;
                      }
         i++;
         }
int di=1;
long long sum=1;
for (i=1;i<=nr;i++) di*=e[i]+1;
for (i=1;i<=nr;i++) sum*=(put(d[i],e[i]+1)-1)/(d[i]-1);
fprintf(g,"%d %d\n",di,sum%prim);
}

int main()
{int t;
ciur();
fscanf(f,"%d",&t);
while (t!=0) {t--;
              rez();}
return 0;
}