#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;
}