Cod sursa(job #419151)

Utilizator perticas_catalinperticas catalin perticas_catalin Data 17 martie 2010 00:53:24
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 2.07 kb
#include<iostream>
#include<string>

using namespace std;

#define NM 1000005
#define MOD 9973
#define LL long long

char ciur[NM];

int primes[NM],dim;

void euclid(int a,int b,int &x,int &y)
{
     if(!b)
     {
          x=1,y=0;
          return ; 
     }
     
     euclid(b,a%b,x,y);
     
     int nx=y,ny=x-(a/b)*y;
     x=nx,y=ny;
}

int invmod(int A,int N)
{
     int x,y;
     
     euclid(A,N,x,y);
     
     while(x<0) x+=N;
     
     return x;
}

int main()
{
    int T,p[100],q[100],k;
    
    freopen("ssnd.in","r",stdin);
    freopen("ssnd.out","w",stdout);
    
    for(int i=2;i<=1000000;++i)
       if(!ciur[i])
       {
           primes[++dim]=i;
           
           for(int j=2*i;j<=1000000;j+=i)
              ciur[j]=1;        
       }
    
    scanf("%d",&T);
    
    LL N;
    
    while(T--)
    {
        scanf("%lld",&N);    
        
        LL nr=N;
        
        k=0;
        
        for(int i=1;i<=dim && nr>1;++i)
        {
           if((LL)primes[i]*primes[i]>N) break;     
                
           if(nr%primes[i]==0)
           {
               p[++k]=primes[i];
               q[k]=0;
               
               while(nr%primes[i]==0) 
               {
                  ++q[k];
                  nr/=primes[i];
               }                  
           }  
        } 
        
        if(nr>1)
        {
            p[++k]=nr;
            q[k]=1;    
        }
        
        int card=1,sum=1;
        
        for(int i=1;i<=k;++i)
           card=(card*(q[i]+1))%MOD; 
        
        for(int i=1;i<=k;++i)
        {
           int p_la_q=1;
           
           for(int j=1;j<=q[i]+1;++j)
              p_la_q=(p_la_q*p[i])%MOD;
           
           p_la_q--;
           if(p_la_q<0) p_la_q+=MOD;
           
           sum=(sum*p_la_q)%MOD;
           
           int invm=invmod(p[i]-1,MOD);
           
           sum=(sum*invm)%MOD;        
        }   
        
        printf("%d %d\n",card,sum);
    }
    
    return 0;
}