Guest User

Untitled

a guest
Jun 22nd, 2018
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.54 KB | None | 0 0
  1. #include <cstdio>
  2. #include <algorithm>
  3.  
  4. using namespace std;
  5.  
  6. struct bignum {
  7.     int val[1001], n;
  8.    
  9.     bignum( int x = 0 ) {
  10.         memset( val, 0, sizeof val );
  11.         val[0] = x; n = 1; trim();
  12.     }
  13.    
  14.     void trim() {
  15.    
  16.         int ost = 0;
  17.        
  18.         for( int i=0; i<n; ++i ) {
  19.             ost = val[i] / 10;
  20.             val[i] %= 10;
  21.             val[i+1] += ost;
  22.         }
  23.        
  24.         for( ; ost > 0; ost /= 10 ) {
  25.             val[n++] = ost % 10;
  26.         }
  27.        
  28.     }
  29.    
  30.     void print() {
  31.         for( int i=n-1; i>=0; --i ) {
  32.             printf( "%d\n", val[i] );  
  33.         }
  34.     }
  35.    
  36. };
  37.  
  38. bignum operator + ( const bignum& a, const bignum& b ) {
  39.     bignum sol = a.n > b.n ? a : b;
  40.     for( int i=0; i < min( a.n, b.n ); ++i ) {
  41.         sol.val[i] = a.val[i] + b.val[i];
  42.     }
  43.     sol.n = max( a.n, b.n );
  44.     return sol;
  45. }
  46.  
  47. bignum operator * ( const bignum& a, const bignum& b ) {
  48.     bignum sol;
  49.     if( a.n == 1 && a.val[0] == 0 ) return bignum( 0 );
  50.     if( b.n == 1 && b.val[0] == 0 ) return bignum( 0 );
  51.     for( int i = 0; i < a.n; ++i  ) {
  52.         for( int j=0; j < b.n; ++j ) { 
  53.             sol.val[i+j] += a.val[i] * b.val[j];   
  54.         }
  55.     }
  56.     sol.n = a.n + b.n - 1;
  57.     return sol;
  58. }
  59.  
  60. bool operator == ( const bignum& a, const bignum& b ) {
  61.     if( a.n != b.n ) return false;
  62.     for( int i=0; i<a.n; ++i )
  63.         if( a.val[i] != b.val[i] ) return false;
  64.     return true;
  65. }
  66.  
  67. bool operator > ( const bignum& a, const bignum& b ) {
  68.     if( a.n > b.n ) return true;
  69.     if( a.n < b.n ) return false;
  70.     for( int i=a.n-1; i>=0; --i ) {
  71.         if( a.val[i] < b.val[i] ) return false;
  72.         if( a.val[i] > b.val[i] ) return true; 
  73.     }
  74.     return false;
  75. }
  76.  
  77. bool operator < ( const bignum &a, const bignum& b ) {
  78.     if( a.n < b.n ) return true;
  79.     if( a.n > b.n ) return false;
  80.     for( int i=a.n-1; i >= 0; --i ) {
  81.         if( a.val[i] > b.val[i] ) return false;
  82.         if( a.val[i] < b.val[i] ) return true;
  83.     }
  84.     return false;
  85. }
  86.  
  87. bignum pola( const bignum& a ) {
  88.     int ost = 0;
  89.     bignum sol, deset( 10 );
  90.     for( int i=a.n-1; i>=0; --i ) {
  91.         ost = ost * 10 + a.val[i]; 
  92.         sol = sol * deset + bignum( ost / 2 );
  93.         ost %= 2;
  94.     }  
  95.     return sol;
  96. }
  97.  
  98. bignum sqrt( const bignum& a ) {
  99.     bignum l, r, t, p;
  100.     l.n = a.n / 2;
  101.     l.val[l.n-1] = 1;
  102.     r.n = a.n / 2 + 2;
  103.     r.val[r.n-1] = 1;
  104.     while( true ) {
  105.         t = l + r;
  106.         if( t.val[0]%2 ) { t.val[0]++; r.val[0]++; }
  107.         t = pola( t );
  108.         p = t * t;
  109.         p.trim();
  110.         if( p == a ) return t;
  111.         if( p < a ) l = t; else r = t;
  112.     }
  113. }
  114.  
  115. int n;
  116. bignum a, b;
  117.  
  118. int main( void ) {
  119.    
  120.     scanf( "%d", &n );
  121.    
  122.     for( int i=n-1; i>=0; --i ) {
  123.         scanf( "%d", &a.val[i] );
  124.     }
  125.    
  126.     a.n = n;
  127.     a = sqrt( a );
  128.     a.trim();
  129.     printf( "%d\n", a.n );
  130.     a.print();
  131.     return 0;
  132.    
  133. }
Add Comment
Please, Sign In to add comment