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

浙公网安备 33010602011771号