#P8560. 兔子

兔子

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define ll long long
#define MAX 100000
#define min( F, A, B ) ({ F FF = A, FFF = B; FF < FFF ? FF : FFF; })

typedef struct Hash {
	int dat, lab;
} Hash;

ll a, alp, sqt5, miu, x = 1<<30, x0, K, P = 1000000009;
Hash has[ MAX + 10 ];

int HashCMP( const void *F, const void *FF ) {
	Hash h1 = *(Hash*)F, h2 = *(Hash*)FF;
	if ( h1.dat < h2.dat ) return -1;
	else return h1.dat > h2.dat;
}

ll fpm( ll F, ll FF, ll P ) {
	ll ans = 1; F %= P;
	for ( ; FF; FF >>= 1, F *= F, F %= P )
		if ( FF & 1 ) ans *= F, ans %= P;
	return ans;
}

ll Cipolla( int n, int P ) {
	ll C_fpm( ll x, ll y, ll w, ll FF, ll P ) {
		void Multi( ll x, ll y, ll u, ll v, ll *tarx, ll *tary ) { *tarx = ( x * u % P + y * v % P * w % P ) % P; *tary = ( x * v + y * u ) % P; }
		ll ansx = 1, ansy = 0;
		for ( ; FF; FF >>= 1, Multi( x, y, x, y, &x, &y ) )
			if ( FF & 1 ) Multi( ansx, ansy, x, y, &ansx, &ansy );
		return ansx;
	}
	ll a;
	if ( fpm( n, ( P - 1 ) / 2, P ) != 1 ) return -1;
	while ( a = rand() % P, fpm( ( a * a % P - n % P + P ) % P, ( P - 1 ) / 2, P ) == 1 );
	return C_fpm( a, 1, ( a * a % P - n % P + P ) % P, ( P + 1 ) / 2, P );
}

ll BSGS( ll x, ll a, ll P ) {
	ll m = sqrt( P ) + 1; int i, top = 0, w = 1<<30; ll e, e_1;
	for ( i = 0, e = 1; i < m; e *= x, e %= P, i++ ) {
		if ( e == a ) return i;
		has[ ++top ] = (Hash){ e, i };
	}
	e_1 = fpm( e, P - 2, P );
	qsort( has + 1, top, sizeof( Hash ), HashCMP );
	for ( i = 1, e = a * e_1 % P; i <= m; e *= e_1, e %= P, i++ ) {
		int l = 1, r = top;
		while ( l < r - 1 ) {
			int m = ( l + r ) >> 1;
			if ( has[ m ].dat <= e ) l = m;
			else r = m;
		}
		if ( has[ l ].dat == e  &&  w > i * m + has[ l ].lab ) w = i * m + has[ l ].lab;
		else if ( has[ r ].dat == e  &&  w > i * m + has[ r ].lab ) w = i * m + has[ r ].lab;
		if ( w != 1<<30 ) return w;
	}
	return -1;
}

int main() {

	scanf( "%lld", &K );

	//if x is an even number.

	a = ( 1 + 5 * K * K % P * fpm( 4, P - 2, P ) % P ) % P;
	alp = Cipolla( a, P );
	if ( alp != -1 ) {
		sqt5 = Cipolla( 5, P );
		
		miu = ( 1 + sqt5 ) * fpm( 2, P - 2, P ) % P;
		x0 = BSGS( miu, ( alp + sqt5 * K % P * fpm( 2, P - 2, P ) % P ) % P, P );
		if ( x0 != -1  &&  ~x0 & 1 ) x = min( ll, x, x0 );
		
		alp = P - alp;
		x0 = BSGS( miu, ( alp + sqt5 * K % P * fpm( 2, P - 2, P ) % P ) % P, P );
		if ( x0 != -1  &&  ~x0 & 1 ) x = min( ll, x, x0 );
	}

	//if x is an odd number.

	a = ( -1 + 5 * K * K % P * fpm( 4, P - 2, P ) % P + P ) % P;
	alp = Cipolla( a, P );
	if ( alp != -1 ) {
		sqt5 = Cipolla( 5, P );
		
		miu = ( 1 + sqt5 ) * fpm( 2, P - 2, P ) % P;
		x0 = BSGS( miu, ( alp + sqt5 * K % P * fpm( 2, P - 2, P ) % P ) % P, P );
		if ( x0 != -1  &&  x0 & 1 ) x = min( ll, x, x0 );
		
		alp = P - alp;
		x0 = BSGS( miu, ( alp + sqt5 * K % P * fpm( 2, P - 2, P ) % P ) % P, P );
		if ( x0 != -1  &&  x0 & 1 ) x = min( ll, x, x0 );
	}

	printf( "%lld\n", x == 1<<30 ? -1 : x );

	return 0;
}