C-Hedwig's Ladder---2018纽约区域赛(递推)

Hedwig’s Ladder

题目链接http://acm.csu.edu.cn:20080/csuoj/problemset/problem?pid=2272
Time Limit: 1 Sec Memory Limit: 128 Mb

Description

Hedwig the hamster enjoys exploring networks of hamster tubes. Each day, Hedwig’s ownerrearranges the tubes to form a new network of tubes.

One day, Hedwig awoke to find that the network of tubes had been arranged in a ladder pattern as shown below, where each junction point (An and Bn) contained a small piece of carrot (Hedwig loves carrots!). Hedwig had not yet explored the new tube network and had no idea how long it was (it may go on forever!)

在这里插入图片描述
avatar

Hedwig decided to make a game where given a length, figure out how many paths from the start, A0, of the given length there are using these rules: Each time a junction is reached, Hedwig eats the piece of carrot that is there. A junction can only be used if there is a piece of carrot there when Hedwig arrives.

To help Hedwig out, you will write a program which finds the number of paths from A0 of a specified length which do not hit any junction more than once. For example, all the paths of length 3 are shown below:
在这里插入图片描述
avatar

Input

The first line of input contains a single decimal integer P, (1 ≤ P ≤ 800), which is the number of data sets that follow. Each data set should be processed identically and independently.

Each data set consists of one line of input. The line contains the data set number, K, followed by the length, N, (1 ≤ N ≤ 1000)of the paths to be counted.

Output

For each data set there is one line of output.

The output line consists of the data set number, K, followed by the number of paths of length N modulo 10007.

Sample Input

4
1 3
2 9
3 18
4 111

Sample Output

1 6
2 110
3 8361
4 237


题目大意:如图,给你一个无限长的地图,宽度只有1步,再给你你能走的步数,不能走走过的点,问你有多少种走法,当你能走三步时就像上图加粗的路线一样有6种走法。
emmmm。。。这题当时没什么想法,但dqa大佬找了个规律,然后A了。。。。
有时候比赛可能也就是这样吧,大胆假设,交它一发。。。
具体的规律是这样的,以dp[1]和dp[2]作为边界,接下来奇数的为dp[i-1]+dp[i-2]+1,偶数就不用加1了。。。预处理一下,然后交它一发。。。

#include <cstdio>
#define mod 10007
int dp[1200];
int main()
{
	int t,n,id; 
	dp[1]=2;dp[2]=3;
	for (int i=3; i<=1000; i++){
		if (i%2) dp[i]=(dp[i-1]+dp[i-2]+1)%mod;
		else dp[i]=(dp[i-1]+dp[i-2])%mod;
	}
	scanf ("%d",&t);
	for (int i=1; i<=t; i++){
		scanf ("%d%d",&id,&n);
		printf ("%d %d\n",i,dp[n]);
	}
	
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值