Cod sursa(job #1122763)

Utilizator delta_wolfAndrei Stoica delta_wolf Data 25 februarie 2014 20:18:57
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
#include <cstdio>
#include <cstring>
using namespace std;
long long bz,ex,s,nr,i,j,n,x,t;
char p[1010/2/8+1];
int main()
{
    freopen("ssnd.in","r",stdin);
    freopen("ssnd.out","w",stdout);
    for(i=1;((i*i)<<1)+(i<<2)<=1000000;i++)
    {
        if(((p[i>>3])&(1<<(i&7)))==0)
        for(j=((i*i)<<1)+(i<<1);(j<<1)+1<=1000000;j+=(i<<1)+1)
        p[i>>3]|=(1<<(j&7));

    }
    scanf("%lld",&n);
    for(t=1;t<=n;t++)
    {
        scanf("%lld",&x);
        s=1;
        nr=1;
        if(x==1)
        printf("1 1");
        else if(x==2)
        printf("2 3");
        else if(x==3)
        printf("2 4");
       else
       {
           if(x%2==0)
           {
               ex=1;
               bz=2;
               while(x%2==0)
               {
                   ex++;
                   x/=2;
                   bz=bz*2;
               }
               s=(s*((bz-1)%9973))%9973;
               nr=nr*ex;
           }
           for(i=1;i*i<=x;i++)
           if((p[i>>3]&(1<<(i&7)))==0)
           {
               ex=1;
               bz=2*i+1;
               while(x%(2*i+1)==0)
               {
                   ex++;
                   x=x/(2*i+1);
                   bz=bz*(2*i+1);
               }
               s=(s*(((bz-1)/(2*i))%9973))%9973;
               nr=nr*ex;
           }
           if(x>1)
           {
               s=(s*(((x*x-1)/(x-1))%9973))%9973;
               nr=nr*2;
           }
           printf("%lld %lld\n",nr,s);
       }
    }
    return 0;
}