Cod sursa(job #2566057)

Utilizator dragossofiaSofia Dragos dragossofia Data 2 martie 2020 18:35:10
Problema Suma si numarul divizorilor Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.8 kb
#include <bits/stdc++.h>
#define mod 9973
using namespace std;
ifstream fin ("ssnd.in");
ofstream fout ("ssnd.out");

long long nr = 1 , sum = 1 , n ;
bool a[2000003] ;
long long prim[1000007]  ;
void ciur ( )
{
 int i , j , ct = 1 ;
 a[ 1 ] = 1 ;
 for ( i = 4 ; i <= 1000001 ; i += 2 )
    a[ i ] = 1 ;
 for( i = 3 ; i <= 1000001; i += 2  )
        if( a [ i ] == 0 )
            for ( j = 3 * i ; j <= 1000001  ; j += 2*i )
                a[ j ] = 1 ;

 prim[ 1 ] = 2 ;
 for( i = 3 ; i <= 1000001; i += 2  )
     if( a [ i ] == 0 )
          prim[ ++ ct ] = i ;

}

long long  exponentiere( int x , int p )
{
  if( p == 1 )
        return x ;
 if( p % 2 == 0 )
    {
     long long t = exponentiere( x , p  / 2 ) ;
     return ( 1LL * t * t  ) % mod ;

    }
 else
    {
     long long t = exponentiere( x , p  / 2 ) ;
     return ( ( 1LL * t * t  ) % mod ) * x % mod  ;
    }
}

long long invers ( int x )
{
  return exponentiere( x , mod - 2 ) ;
}

void desc( long long x )
{
  long long ct , d = prim[ 1 ] , p , num = 1  ;
  while( x > 1 )
    {
     p = 1;
     ct = 0 ;
     while( x % d == 0 )
        {
         x= x / d ;
         p = ( p * d ) % mod ;
         ct ++ ;
         //cout<<x<<" "<<d<<"\n";
        }

     if( ct > 0 )
        {
         nr = ( nr * ( ct + 1 ) ) % mod ;
         p = ( p * d ) % mod ;
         p = p - 1 ;

         sum = ( sum * ( p * invers( d - 1 ) ) ) % mod ;
        }
     d = prim [ ++ num ] ;
     if( d * d > x )
            d = x ;
    }

}

int main()
{   long long x ;
    ciur();
    fin >> n;
    for ( int  i = 1 ; i <= n ; i ++  )
        {
         fin >> x;
         desc( x ) ;
         fout << nr << " " << sum << "\n" ;
         sum = 1 ;
         nr = 1 ;
        }

    return 0;
}