CodeForces-Umka and a Long Flight

题目

首先一定要明白的就是 
F0^2+F1^2+F2^2......=Fn*Fn+1  刚好两个1边长
Fn*Fn+1=Fn*(Fn-1+Fn)+Fn^2

最终就是两个边长为1的 一个边长位2.....构成这个矩形

首先我们可以想到

如果我们不断的分Fn^2的正方形 最终一定可以划分成功

然后就是怎么划分了

由于给定的横坐标纵坐标 导致了划分区域不同

注意这里的x其实是y的意思 给的y才是x的意思

然后就是

每次划分n 对于新的矩形 我们要进行翻转 因为规定了 一定是长大于宽的,因为每次拿横的去和长比 否则每次不能划分 所以还是要旋转

对于旋转90度的坐标跟之前的旋转矩形重回那个不同的 不能死记硬背 这道题画个图自己看吧 就是swap x,y即可 别的就没啥了 这道题还是挺好的 我都不知道这么个结论。

#include <bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
const int range = 2e5 + 5;
int n;
int dp[50];
int x, y;
void init() {
	dp[0] = 1;
	dp[1] = 1;
	dp[2] = 2;
	for (int i = 3; i <= 45; i++) {
		dp[i] = dp[i - 1] + dp[i - 2];
	}
}
bool dfs(int n, int x, int y) {
	int zuobian = dp[n - 1];
	int youbian = dp[n];
	if(n==1)
	{
		return 1;
	}
	//zuo + you =dpn+1
	//cout<<zuobian<<" "<<youbian<<" "<<y<<endl;
	if (y <= zuobian) {
		return dfs(n - 1, y, x);
	} else if (y > youbian) {
		return dfs(n - 1, y - dp[n], x);
		//相当于 y x 只不过 此时的y是y=dpn 千万不要
		///纸上推
	} 
	else
		return 0;
}
void solve() {
	cin >> n >> x >> y;
//	cout << dp[n] << " " << dp[n + 1] << endl;
	if (dfs(n, x, y)) {
		cout << "YES" << endl;
		return;
	} else {
		cout << "NO" << endl;
		return ;
	}
}
signed main() {
	ios::sync_with_stdio();
	cin.tie(0);
	cout.tie(0);
	init();
	int t;
	cin>>t;
	while(t--)
	solve();
	return 0;
}
posted @ 2025-04-16 19:57  LteShuai  阅读(11)  评论(0)    收藏  举报