题意:第数n是斐波那契的第k个数,让你求有多少满足这个的序列(成员非负,不下降)
思路:
1 2 3 4 5 6 7
0 1 1 2 3 5 8
fib(1) fib(2) fib(3) fib(4) fib(5) fib(6) fib(7)
0a+1b 0a+1b 1a+1b 1a+2b 2a+3b 3a+5b 5a+8b
a的系数是fib(i-1),b的系数是fib(i)
代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<vector>
#include<cstring>
#include<algorithm>
#include<map>
#include<stack>
#include<set>
#include<queue>#define maxn 500
//#define ll long long
#define int long longint n;
int a, b;
int minn = 0, maxx = 0x3f3f3f3f3f;
int x, y;
using namespace std;
int f(int x)
{if (x == 1)return 0;if (x == 2)return 1;return f(x - 1) + f(x - 2);
}
void solve()
{int n, k;cin >> n >> k;int a=0, b=1, c=0;//for (int i = 1; i <= 100; i++)//我们会发现第二十九个就超出了2*10^5即给的n最大值。// ////{// if (f(i) > 200000)// {// cout << " " << i << endl;// break;// }//}if (k > 29)//注意特判{cout << 0 << endl;return;}for (int i = 1; i <= k; i++)//fib{if (i == 1){c = 0;continue;}if (i == 2){c=1;continue;}c = a + b;a = b;b = c;}int ans = 0;//a*x+b*y=n->y=(n-ax)/b&&intfor (int i = 0; i <= n/2; i++){if ((n - a * i) % b == 0 && ((n - a * i) / b) >= i)ans++;}cout << ans<<endl;
}
signed main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int t;cin >> t;while(t--)solve();return 0;
}