看似是搜索,实际是一道思维题。
从大到小分n,肯定能分完。
当前的k个数肯定是最小的。
然后比如:f[4]最多能分成f[4]个数,最少分成1个数。
推论f[i]最多能分成f[i]个数,最少分成1个数。
最后得出一个范围,看k是否在范围内即可。
#include <iostream>
//#include <bits/stdc++.h>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <set>
#include <queue>
#include <map>
#include <deque>
#include <cstdlib>
#define lowbit(x) ((x) & -(x))
#define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
const int maxn = 1e6 + 7;
const int INF = 0x3f3f3f3f;
typedef long long ll;
using namespace std;
const ll mod = 1e9 + 7;
const double pi = acos(-1.0);
inline int read(){
int x = 0, f = 1;
char ch = getchar();
while(ch < '0' || ch > '9'){
if (ch == '-')
f = -1;
ch = getchar();
}
while(ch >= '0' && ch <= '9'){
x = (x<<1) + (x<<3) + (ch^48);
ch = getchar();
}
return x * f;
}
ll f[100];
ll vis[100];
ll n, k;
int main(){
ios::sync_with_stdio(false);
// freopen("text.txt","r",stdin);
// freopen("out1.txt","w",stdout);
f[1] = 1;
f[2] = 2;
for (int i = 3;i < 87 ; i ++)
f[i] = f[i-1] + f[i-2];
int t;
cin >> t;
while(t --){
cin >> n >> k;
memset(vis,0,sizeof(vis));
for (int i = 86; i >= 1; i --){
vis[i] += n / f[i];
n = n % f[i];
}
ll minl = 0, maxl = 0;
for (int i = 1; i <= 86; i ++){
minl += vis[i]*1;
maxl += vis[i]*f[i];
}
if (k >= minl && k <= maxl)
printf("Yes\n");
else
printf("No\n");
}
return 0;
}