Cod sursa(job #862584)

Utilizator alex45meOlaru Alex alex45me Data 22 ianuarie 2013 19:53:13
Problema Suma si numarul divizorilor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <iostream>
#include <stdio.h>
#include <math.h>

using namespace std;


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

int t,k,i,j,ok,pu;
long long v[1000000],s,d,p,y,x;

bool ciur(int n)
{
    int i,j;
    bool p[1000000];
    for (i=2;i<=n;i++)
           if (p[i]==0){
              v[0]++;
              v[v[0]]=i;
              for (j=i+i;j<=n;j=j+i)
                  p[j]=1;
                  }
}

int ridic(int x, int put)
{
    int sl=1,p=(x%9973);

    for (;put;put>>=1,p=(p*p)%9973)
        if (put&1)
        {
            sl=(sl*p)%9973;
        }

    return sl;
}


int main()
{
    fscanf(f,"%d",&t);
    ciur(1000005);
    for (j=1;j<=t;j++){
        d=1;
        s=1;
         fscanf(f,"%lld",&x);
        i=1;ok=0;
        y=(long long )sqrt(x);
        while (v[i]<=y)
             {
              k=0;p=1;ok=1;
              while (x % v[i]==0)
                 {x=x/v[i];
                  k++;
                 }
              d=d*(k+1);
              pu=ridic(v[i],k+1);
              s=(s*((pu-1)/(v[i]-1)))%9973;
              i++;

         }
              if (x!=1 && ok==1 ) {d=d*2; s=(s*((x*x-1)/(x-1)))%9973;}

              if (d==1) fprintf(g,"2 %lld\n",x+1); else
        fprintf(g,"%lld %lld\n",d,s);
    }
    return 0;
}