Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstdio>
- #include <algorithm>
- using namespace std;
- struct bignum {
- int val[1001], n;
- bignum( int x = 0 ) {
- memset( val, 0, sizeof val );
- val[0] = x; n = 1; trim();
- }
- void trim() {
- int ost = 0;
- for( int i=0; i<n; ++i ) {
- ost = val[i] / 10;
- val[i] %= 10;
- val[i+1] += ost;
- }
- for( ; ost > 0; ost /= 10 ) {
- val[n++] = ost % 10;
- }
- }
- void print() {
- for( int i=n-1; i>=0; --i ) {
- printf( "%d\n", val[i] );
- }
- }
- };
- bignum operator + ( const bignum& a, const bignum& b ) {
- bignum sol = a.n > b.n ? a : b;
- for( int i=0; i < min( a.n, b.n ); ++i ) {
- sol.val[i] = a.val[i] + b.val[i];
- }
- sol.n = max( a.n, b.n );
- return sol;
- }
- bignum operator * ( const bignum& a, const bignum& b ) {
- bignum sol;
- if( a.n == 1 && a.val[0] == 0 ) return bignum( 0 );
- if( b.n == 1 && b.val[0] == 0 ) return bignum( 0 );
- for( int i = 0; i < a.n; ++i ) {
- for( int j=0; j < b.n; ++j ) {
- sol.val[i+j] += a.val[i] * b.val[j];
- }
- }
- sol.n = a.n + b.n - 1;
- return sol;
- }
- bool operator == ( const bignum& a, const bignum& b ) {
- if( a.n != b.n ) return false;
- for( int i=0; i<a.n; ++i )
- if( a.val[i] != b.val[i] ) return false;
- return true;
- }
- bool operator > ( const bignum& a, const bignum& b ) {
- if( a.n > b.n ) return true;
- if( a.n < b.n ) return false;
- for( int i=a.n-1; i>=0; --i ) {
- if( a.val[i] < b.val[i] ) return false;
- if( a.val[i] > b.val[i] ) return true;
- }
- return false;
- }
- bool operator < ( const bignum &a, const bignum& b ) {
- if( a.n < b.n ) return true;
- if( a.n > b.n ) return false;
- for( int i=a.n-1; i >= 0; --i ) {
- if( a.val[i] > b.val[i] ) return false;
- if( a.val[i] < b.val[i] ) return true;
- }
- return false;
- }
- bignum pola( const bignum& a ) {
- int ost = 0;
- bignum sol, deset( 10 );
- for( int i=a.n-1; i>=0; --i ) {
- ost = ost * 10 + a.val[i];
- sol = sol * deset + bignum( ost / 2 );
- ost %= 2;
- }
- return sol;
- }
- bignum sqrt( const bignum& a ) {
- bignum l, r, t, p;
- l.n = a.n / 2;
- l.val[l.n-1] = 1;
- r.n = a.n / 2 + 2;
- r.val[r.n-1] = 1;
- while( true ) {
- t = l + r;
- if( t.val[0]%2 ) { t.val[0]++; r.val[0]++; }
- t = pola( t );
- p = t * t;
- p.trim();
- if( p == a ) return t;
- if( p < a ) l = t; else r = t;
- }
- }
- int n;
- bignum a, b;
- int main( void ) {
- scanf( "%d", &n );
- for( int i=n-1; i>=0; --i ) {
- scanf( "%d", &a.val[i] );
- }
- a.n = n;
- a = sqrt( a );
- a.trim();
- printf( "%d\n", a.n );
- a.print();
- return 0;
- }
Add Comment
Please, Sign In to add comment