Loading

斐波那契

多画点图,因为这个题一看就是找规律。
画图一推之后,发现每次的父亲都是他减去他能减掉的最大的\(fib\)数。
那就倒序枚举,\(O(60)\)完成操作,记录到数组里面,然后暴力匹配即可

#include <cstring>
#include <algorithm>
#include <cstdio>
#define mp make_pair
#define R register int
#define int long long
#define printf Ruusupuu = printf

int Ruusupuu ;

using namespace std ;
typedef long long L ;
typedef long double D ;
typedef unsigned long long G ;
typedef pair< int , int > PI ;
const int N = 1e2 + 10 ;

inline int read(){
	int w = 0 ; bool fg = 0 ; char ch = getchar() ;
	while( ch < '0' || ch > '9' ) fg |= ( ch == '-' ) , ch = getchar() ;
	while( ch >= '0' && ch <= '9' ) w = ( w << 1 ) + ( w << 3 ) + ( ch ^ '0' ) , ch = getchar() ;
	return fg ? -w : w ; 
}

inline void wap( int &a , int &b ){ a = a ^ b , b = a ^ b , a = a ^ b ; }
inline int mins( int a , int b ){ int zt = b - a ; return a + ( zt & ( zt >> 31 ) ) ; }
inline int maxs( int a , int b ){ int zt = b - a ; return b - ( zt & ( zt >> 31 ) ) ; }
inline int abss( int a ){ int zt = a >> 31 ; return ( a + zt ) ^ zt ; }

int T , fb [N] , x , y , stx [N] , sty [N] , topx , topy , ans ;

void sc(){
	T = read() ;	
	fb [1] = 0 , fb [1] = 1 ;
	for( R i = 2 ; i <= 60 ; i ++ )
		fb [i] = fb [i - 1] + fb [i - 2] ; 
}

inline void clear(){
	memset( stx , 0 , sizeof( stx ) ) ;
	memset( sty , 0 , sizeof( sty ) ) ;
	topx = topy = ans = 0 ;	 
}

inline void Addthem( int x , int y ){
	stx [++ topx] = x , sty [++ topy] = y ;
	for( R i = 60 ; i >= 1 ; i -- ){
		if( x > fb [i] ) x -= fb [i] , stx [++ topx] = x ;
		if( y > fb [i] ) y -= fb [i] , sty [++ topy] = y ;
	}  sort( stx + 1 , stx + 1 + topx ) , sort( sty + 1 , sty + 1 + topy ) ; 
	stx [1] = sty [1] = 1 ;
//	for( R i = 1 ; i <= topx ; i ++ ) printf( "%lld " , stx [i] ) ; puts( "" ) ;
//	for( R i = 1 ; i <= topy ; i ++ ) printf( "%lld " , sty [i] ) ; puts( "" ) ;
		int top = max( topx , topy ) ;
	for( R i = 1 ; i <= top ; i ++ )
		if( stx [i] != sty [i] ) { ans = stx [i - 1] ; break ; }
	if( !ans ) ans = stx [topx] ;
}

void work(){
	while( T -- ){
		clear() ;
		x = read() , y = read() ;
		Addthem( x , y ) ;	
		printf( "%lld\n" , ans ) ;
	}
}

signed main(){	
	sc() ;
	work() ;
	return 0 ;
} 

posted @ 2021-06-27 21:05  Soresen  阅读(64)  评论(0)    收藏  举报