您的位置:首页 > 其它

啊,第一次月赛天杀的散步题目

2016-04-24 00:15 134 查看

00001:郭姐散步

总时间限制: 1000ms 内存限制: 32768kB
描述

The first lady of our lab is GuoJie, GuoJie likes walking very much.

Today GuoJie walks from the original point (0, 0), everytime he(may be she?) can go up or left or right a step.

But she can't go back the point where she have visited.

For example, if he goes up a step, she will be at (1, 0) and she never comes back the point.

Now, if she can walk n(n <= 1000000) steps, can you find how many ways she can walk? the result mod 1e9 + 7. 

输入There will be T (T <= 100) cases, each case will input a n.
输出For each group of input integers you should output how many ways GuoJie can walk in one line, and with one line of output for each line in input.
样例输入
1
2


样例输出
7


提示n<=0 输出0
来源Json
题目的大意就是给定一个步数,在这个步数上你可以向上向左向右走,但是不可以走到已经走过点上,如果给步数为1,那么他可以向左向右向上,一共三种情况。是2的话,就会有七种情况,3会有17种。首先,这道题目我一开始是看不懂的,然后弄懂后就开始做,问题是,我一开始做,就忘记题目的本身了,别人说是不可以向下走的,导致我的第三步一直是19种,后面也错了,也就找不出答案。不过后来復锦学长给我花了个图,我感觉整个人的思路都清晰了啊。就是,我们规定,左上右分别为1,2,3,那么图形可以变为:


这个图就很好理解了,1.任何点都可以向上,2.向左的点只能继续向左,向右的点继续向右,3.向上的点可以向左也可以向右,总结就是:左右                       上           总2                           1            32 + 1 * 2 = 4         3            74 + 3 * 2 = 10       7            17这就是一个递推关系式了。接下来还有一个定理,取余方面的,可能是中国剩馀定理吧就是:(a+b)%c = ((a%c)+(b%c))%c否则接下来的a和b和sum都是很容易就爆炸的,毕竟步数等于1000000真正的数是超级大的这些问题都解决了,但是我一直TE,超时,我对超时一直都是讳莫如深,因为我觉得我没法优化算法,但是这一次并不是用什么数学方法优化,只是简简单单的一个打表,我竟然一直没去做,导致没输入一次数字都要重新循环计算很久,超时就很正常了啊!!!!!!!!!!下面是我的代码:
#include<stdio.h>
long long sum[1000005];
int main()
{
int t,n,i;
long long a,b,top,m=1e9+7;//取余的话需要整数对整数,1e9是浮点数,强制转换存起来好了
a = 1;
b = 1;
sum[0] = a + 2 * b;
for(i = 2; i <= 1000005; i++)//打表,规定向左为b,乘以2就是左右的和,向上是a
{
top = a;
a = (top + 2 * b) % m;
b = (top + b) % m;
sum[i - 1]= (a + 2 * b) % m;
}
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
if(n > 0)
printf("%d\n",sum[n - 1]);
else
printf("0\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: