Cod sursa(job #863010)

Utilizator vladvaldezVlad Dimulescu vladvaldez Data 23 ianuarie 2013 10:13:49
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 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[80001],nr1,maxim,i,j,mod=9973,s;
long long div,l,maxi,a[1001];

void ciur()
{
 int i,j;

  v[2]=0;//2 este singurul nr prim par
  nr1=1;
  b[nr1]=2;
  for(i=3;i<=maxim;i+=2)//i-ul incepe cu val 3 si creste cu 2 ca sa ignor celelalte nr pare
    if (v[i]==0)//daca e prim
     {
      nr1++;
      b[nr1]=i;
      for(j=3;i*j<=maxim;j+=2)
       v[i*j]=1;//bifesez multiplii
    }
}

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;//nr de divizori
    s=1; //suma
    l=a[i];//copie
    j=1;
    while((long long)b[j]*b[j]<=a[i] && j<=nr1 && l!=1)
     {
     if (l%b[j]==0)
      {
       p=0;//puterea la care se gaseste divizorul in numar
       div=1;
       while(l%b[j]==0){
          p++;//creste puterea
          l=l/b[j];
          div=div*b[j];
       }
      div=div*b[j]-1;
      s=(s*(div/(b[j]-1)))%mod;//sd=(div1^(p1+1))/(p1-1)...*(divn^(pn+1))/(pn-1)
      nr=nr*(p+1);//nrd=(p1+1)*(p2+1)*...(pn+1)
      }
    j++;
 }
     if (l!=1){nr=nr*2;s=(s*(l*l-1)/(l-1))%mod;}
     //verif cazul in care numarul are un divizor prim mai mare ca radicalul sau

     fprintf(g,"%d %d\n",nr,s);
 }

fclose(g);
return 0;
}