ZZULIOJ-2905

新生邀请赛A

题目描述

madoka的面前有n级台阶,目前她处于第0级台阶,她每一次可以选择选择爬一级台阶或是连爬两级台阶,madoka想知道她有几种到达第n级台阶的走法。出乎意料的是,n级台阶中有k级台阶被损坏了,madoka无法抵达这些被损坏的台阶。

输入

第一行输入一个正整数T,表示测试样例数。

对于每个测试样例,共两行,第一行给出两个正整数n,k,表示台阶的级数以及损坏的台阶数。

第二行给出k个正整数ai,表示第ai级台阶被损坏。

1 <= T <= 10

1 <= n <= 105

1 <= k,ai <= n

输出

对于每个测试样例,输出一个正整数,表示madoka到达第n级台阶的方法数。

答案对1000000007取模。

样例输入 Copy

2
3 1
1
3 3
1 2 3

样例输出 Copy

1
0
#include <iostream>
#include <cstring>
using namespace std;
int a[100010],o[100010];//a用来存方法数  o用来存坏的台阶
int main()
{
	int t;
	cin >> t;
	while(t--)
	{
		memset(a,0,sizeof a);//一定要数组清零 记得加头文件
		memset(o,0,sizeof o);
		int n,k,num=0;
		cin >> n >> k;
		while(k--)
		{
			int l;
			cin >> l;
			o[l]=1;//将所有的坏的台阶都标记
		}
		a[0]=1;//类似斐波那契  得先定义一个数然后递推
		for(int i=1;i<=n;i++)
		{
			if(o[i]>0) continue;//遇见坏台阶就跳过
			else a[i]=a[i-1]+a[i-2];//跳台阶推导
			a[i]%=1000000007;
		}
		cout << a[n] << endl;
	}
	
	
}

 参考跳台阶推导:(15条消息) 面试题经典:跳台阶问题_leo115的专栏-CSDN博客_跳台阶问题https://blog.csdn.net/leo115/article/details/8039962?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164725793516781683998182%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=164725793516781683998182&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-1-8039962.142%5Ev2%5Epc_search_result_cache,143%5Ev4%5Eregister&utm_term=%E8%B7%B3%E5%8F%B0%E9%98%B6&spm=1018.2226.3001.4187

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这是一道经典的位运算题目,考察对二进制的理解和位运算的熟练程度。 题目描述: 给定一个长度为 $n$ 的数组 $a$,初始时每个数的值都为 $0$。现在有 $m$ 个操作,每个操作为一次询问或修改。 对于询问,给出两个整数 $l,r$,求 $a_l \oplus a_{l+1} \oplus \cdots \oplus a_r$ 的值。 对于修改,给出一个整数 $x$,表示将 $a_x$ 的值加 $1$。 输入格式: 第一行两个整数 $n,m$。 接下来 $m$ 行,每行描述一次操作,格式如下: 1 l r:表示询问区间 $[l,r]$ 的异或和。 2 x:表示将 $a_x$ 的值加 $1$。 输出格式: 对于每个询问操作,输出一个整数表示答案,每个答案占一行。 数据范围: $1 \leq n,m \leq 10^5$,$0 \leq a_i \leq 2^{30}$,$1 \leq l \leq r \leq n$,$1 \leq x \leq n$ 输入样例: 5 5 2 1 2 3 1 2 4 2 2 1 1 5 输出样例: 0 2 解题思路: 对于询问操作,可以利用异或的性质,即 $a \oplus b \oplus a = b$,将 $a_l \oplus a_{l+1} \oplus \cdots \oplus a_r$ 转化为 $(a_1 \oplus \cdots \oplus a_{l-1}) \oplus (a_1 \oplus \cdots \oplus a_r)$,因为两个前缀异或后的结果可以相互抵消,最后的结果即为 $a_1 \oplus \cdots \oplus a_{l-1} \oplus a_1 \oplus \cdots \oplus a_r = a_l \oplus \cdots \oplus a_r$。 对于修改操作,可以将 $a_x$ 对应的二进制数的每一位都分离出来,然后对应位置进行修改即可。由于只有加 $1$ 操作,所以只需将最后一位加 $1$ 即可,其余位不变。 参考代码:

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值