1031 骨牌覆盖 (斐波拉契数列)
哎呀,以后还是这类题还是多联想。(特点:走的方式不同,但到达某一地点是由后一步的两种情况决定的。)
Input
输入N(N <= 1000)
Output
输出数量 Mod 10^9 + 7
Input示例
3
Output示例
3然后,再除以二,那么将相当与这整个情况是由这两个
我先把我的错误思路搞一下。
就是将输入的个数先都变成偶数,


公式如下如果是偶数sum, 奇数就是2*sum-1;就成了。aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa就是不对啊,反正我觉没毛病。如果有大佬知道错在哪里希望指正一下。代码如下:()错误
#include<cstdio> #define MOD int(1e9)+7 #define MAXN 1002 #define ll long long ll dp[MAXN]; int main() { int n; scanf("%d", &n); int k = (n % 2 == 1) ? ((n - 1) / 2) : (n / 2); dp[0] = 1; for (int i = 1; i <= k; ++i) { dp[i] = dp[0] = 1; for (int j = i - 1; j >= 1; --j) dp[j] = (dp[j]+dp[j - 1])%MOD; } ll sum = 0; for (int i = 0; i <= k; ++i) sum += dp[i]; if (n % 2){ sum = 2 * sum - 1; } printf("%lld\n", sum); }
但是,其实也可以这样做,假设n个,那么他的排列一定是加2前的情况和加1的情况,为什么呢?应因为1只有一种排法,2有两种,相当于不同的方式到达同一个地方一样。那么就很符合斐波拉契数列的
代码如下:
#include<cstdio> #define MOD int((1e9)+7) #define ll long long #define MAXN 1001 ll num[MAXN]; int main() { num[0] = 1; num[1] = 1; int n; scanf("%d", &n); for (int i = 2; i <= n; i++) { num[i] = (num[i - 1] + num[i - 2])%MOD; } printf("%lld\n", num[n]); }
记得复习斐波拉契数列的性质
作者:ALINGMAOMAO
出处:https://www.cnblogs.com/ALINGMAOMAO/p/9450468.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探