Cod sursa(job #1703728)

Utilizator andy1207Cioltan Andrei andy1207 Data 17 mai 2016 15:53:12
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.87 kb
#include<cstdio>
#define M 9973
#define MAX_N 1001000
long long inv[9999];//9973
char ciur[MAX_N];
int v[MAX_N],q=0;
/*void calc_ciur()
{
 for(int d=2;d<=MAX_N;d++)
    {
     if(ciur[d]==0)
        {
         v[++q]=d;
         for(int i=d+d;i<=MAX_N;i+=d)
            {
             ciur[i]=1;
            }
        }
    }
}*/
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,p,nrdiv,sdiv,put,s,j/*,d*/;
 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");
 //calc_ciur();
 for(int d=2;d<=MAX_N;d++)
    {
     if(ciur[d]==0)
        {
         v[++q]=d;
         for(int i=d+d;i<=MAX_N;i+=d)
            {
             ciur[i]=1;
            }
        }
    }
 for(i=1;i<=t;i++)
    {
     scanf("%lld",&n);
     //d=2;
     nrdiv=sdiv=1;
     s=n;
     j=1;
     while(v[j]*v[j]<=n && j<=n)
          {
           p=0;
           put=1;
           while(n%v[j]==0)
                {
                 n/=v[j];
                 p++;
                 put=put*v[j]%M;
                }
           put*=v[j];
           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[(v[j]-1+M)%M]%M;
               s=s/v[j]*(v[j]-1);
              }
           //d++;
           j++;
          }
     if(n!=1)
        {
         nrdiv=nrdiv*2;
         sdiv=sdiv*(n+1)%M;
         s=s/n*(n-1);
        }
     printf("%lld %lld\n",nrdiv,sdiv%M);
    }
return 0;
}