赞
踩
破损的楼梯
问题描述
小蓝来到了一座高耸的楼梯前,楼梯共有N级台阶,从第0级台阶出发。小蓝每次可以迈上1级或2级台阶。但是,楼梯上的第a1级、第a₂级、第ag级,以此类推,共M级台阶的台阶面已经坏了,不能踩上去。
现在,小蓝想要到达楼梯的顶端,也就是第N级台阶,但他不能踩到坏了的台阶上。请问他有多少种不踩坏了的台阶到达顶端的方案数?
由于方案数很大,请输出其对10°+7取模的结果。
输入格式
第一行包含两个正整数N(1≤N≤10⁵)和M(O≤M≤N),表示楼梯的总级数和坏了的台阶数。
接下来一行,包含M个正整数a1,a2,...,am(1≤al<a2<
a3<am≤N),表示坏掉的台阶的编号。
输出格式
输出一个整数,表示小蓝到达楼梯顶端的方案数,对10⁹+7取模。
样例输入
61
3
样例输出
4
运行限制
语言
最大运行时间
C++
1s
C
1s
Java
2s
Python3
3s
最大运行内存
256M
256M
256M
256M
- #include <iostream>
- #include <vector>
- using namespace std;
-
- const int MOD = 1e9 + 7;
-
- int main() {
- int N, M;
- cin >> N >> M;
- vector<bool> bad(N + 1, false); // 标记坏的台阶
- for (int i = 0; i < M; ++i) {
- int a;
- cin >> a;
- bad[a] = true;
- }
-
- vector<int> dp(N + 1, 0);
- dp[0] = 1; // 在地面,只有一种方式
- for (int i = 1; i <= N; ++i) {
- if (!bad[i]) {
- dp[i] = dp[i - 1] + (i >= 2 ? dp[i - 2] : 0);
- dp[i] %= MOD;
- }
- }
-
- cout << dp[N] << endl;
- return 0;
- }

源代码:
- #include<bits/stdc++.h>
- using namespace std;
- const int N = 1e5 + 10 , mod = 1e9 + 7;
- int n , m , x , f[N] , vis[N];
- signed main(){
- cin >> n >> m;
- for(int i = 1 ; i <= m ; i ++) {
- cin >> x;
- vis[x] = 1;
- }
- f[0] = 1;
- for(int i = 1 ; i <= n ; i ++){
- if(vis[i]) continue ;
- f[i] = f[i - 1] + f[i - 2];
- f[i] %= mod;
- }
- cout << f[n] << '\n';
- return 0;
- }

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。