当前位置: 首页 > news >正文

【CF】Day73——Codeforces Round 887 (Div. 2) B (思维 + 模拟)

B. Fibonaccharsis

题目:

思路:

比C题有意思,但也么意思

对于这一题我们可以考虑最小的情况,即 f0 = 0,f1 =1 时,然后看看什么时候会超过 n 的最大值,我们可以发现 k > 30 时就炸了,所以如果 k > 30 就可以直接输出 0

然后我们讨论 k <= 30 的情况即可,我们发现如果正向考虑是很难的,所以我们反向考虑

我们既然知道最后一位,那我们尝试枚举前一位是什么,其范围一定在 0 ~ n 中,然后根据公式我们直接一个一个往前枚举即可,只要有某一位小于 0,那么就不行,否则最后一定满足 a[0] >= 0,此时我们取这个即可,时间复杂度最坏为 n*30 可以过 

代码:

#include <iostream>
#include <algorithm>
#include<cstring>
#include<cctype>
#include<string>
#include <set>
#include <vector>
#include <cmath>
#include <queue>
#include <unordered_set>
#include <map>
#include <unordered_map>
#include <stack>
#include <memory>
using namespace std;
#define int long long
#define yes cout << "Yes\n"
#define no cout << "No\n"void solve()
{int n, k;cin >> n >> k;if (k >= 30){cout << "0\n";return;}int cnt = 0;vector<int> f(31, 0);f[k] = n;int flag = 0;auto dfs = [&](auto self,int dep) ->void{if (dep < 0){return;}f[dep] = f[dep + 2] - f[dep + 1];if (f[dep] < 0){flag = 0;return;}self(self, dep - 1);};for (int i = 0; i <= n; i++){flag = 1;f[k - 1] = i;dfs(dfs, k - 2);cnt += flag;}cout << cnt << endl;
}signed main()
{cin.tie(0)->sync_with_stdio(false);int t = 1;cin >> t;while (t--){solve();}return 0;
}

相关文章:

  • 20250602在Ubuntu20.04.6下修改压缩包的日期和时间
  • 内网应用如何实现外网访问?无公网IP本地端口网址服务提供互联网连接
  • python打卡day43@浙大疏锦行
  • 软件开发项目管理工具选型及禅道开源版安装
  • 从0开始学vue:vue3和vue2的关系
  • 《信号与系统》--期末总结V1.0
  • 【算法训练营Day05】哈希表part1
  • 逐步检索增强推理的跨知识库路由学习
  • Ubuntu22.04 安装 CUDA12.8
  • 类和对象:实现日期类
  • MATLAB 安装与使用详细教程
  • gcc符号表生成机制
  • 【位运算】只出现⼀次的数字 II(medium)
  • 【latex】易遗忘的表达
  • esp32 platformio lvgl_gif的使用和踩坑情况
  • Qt OpenGL 3D 编程入门
  • 2 Studying《Effective STL》
  • 使用ArcPy批量处理矢量数据
  • inux系统基本操作命令(系统信息查看)
  • MyBatis04:SpringBoot整合MyBatis——多表关联|延迟加载|MyBatisX插件|SQL注解
  • 怎样做企业营销网站/网络营销的特征和功能
  • 匠王红木在那个网站做众筹/久久seo正规吗
  • 秦皇岛做网站公司/下拉关键词排名
  • 政府网站外语版建设/淘宝搜索关键词排名
  • 餐饮品牌网站建设/合肥推广外包公司
  • 网站开发方式有哪四种/网站及推广