Cod sursa(job #1701998)

Utilizator andy1207Cioltan Andrei andy1207 Data 14 mai 2016 13:34:25
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include<cstdio>
long long inv[9999];//9973
#define M 9973
long long putere(long long a,long long n)//a^n
{
 long long p;
 p=1;
 while(n!=0)
      {
       if(n%2!=0)
          p=p*a%M;
       a=a*a%M;
       n/=2;
      }
 return p%M;
}
int main()
{
 long long n,t,i,d,p,nrdiv,sdiv,put,cn,s,e;
 freopen("ssnd.in","r",stdin);
 freopen("ssnd.out","w",stdout);
 scanf("%lld",&t);
 for(i=1;i<M;i++)
    {
     inv[i]=putere(i,M-2);
     //printf("%d ",inv[i]);
    }
 //printf("\n");
 for(i=1;i<=t;i++)
    {
     scanf("%lld",&n);
     cn=n;
     d=2;
     nrdiv=sdiv=1;
     s=n;
     while(d*d<=n)
          {
           p=0;
           put=1;
           while(n%d==0)
                {
                 n/=d;
                 p++;
                 put=put*d%M;
                }
           put*=d;
           put %= M;
           put--;
           if (put == -1)
            put += M;
           if(p!=0)
              {
               nrdiv=nrdiv*(p+1);
               //sdiv=sdiv*((put-1)/(d-1))%9973;
               sdiv =sdiv*put%M*inv[d-1]%M;
               s=s/d*(d-1);
              }
           d++;
          }
     if(n!=1)
        {
         nrdiv=nrdiv*2;
         sdiv=sdiv*(n+1)%9973;
         s=s/n*(n-1);
        }
     //n^e
     /*
     n=cn;
     e=s-1;
     p=1;
     while(e!=0)
          {
           if(e%2!=0)
              p=p*n%M;
           n=n*n%M;
           e/=2;
          }
     if(nrdiv==2)
        sdiv=cn+1;
     */
     printf("%lld %lld\n",nrdiv,sdiv%9973);
    }
return 0;
}