时间限制 1000 ms 内存限制 64 MB 题目描述 楼梯有n阶,可以一步上一阶、两阶或三阶,问有多少种不同的走法 由于答案很大,mod(1e9+7)输出
输入数据 一个正整数n,代表楼梯的阶数,n<=1000000
输出数据 方案数
样例输入 3 样例输出 4
这道题并不难,静下心来,思路很快就会出来,到达n阶楼梯的方案数有n-1,n-2,n-3决定。 代码如下:
#include<iostream> #include<cstring> using namespace std ; //下面这三种方式都对 //const int M = 1000000007 ; //#define M 1000000007 //切记没有分号 int M(1e9+7) ; //这种方式不太懂,看同学这么写的 int main(){ int n ; cin>>n ; int a[n+1] ; memset(a,0,sizeof(a)) ; a[1] = 1 ; a[2] = 2 ; a[3] = 4 ; if(n==1){ cout<<a[1] ; return 0 ; }else if(n==2){ cout<<a[2] ; return 0 ; }else if(n==3){ cout<<a[3] ; return 0 ; } for(int i=4;i<=n;i++){ a[i] = ((a[i-1] + a[i-2])%M +a[i-3])%M ; } cout<<a[n] ; return 0 ; }为什么喜欢用mod 1e9+7,即mod 1000000007 呢?原文链接:https://blog.csdn.net/lxt_Lucia/article/details/81210762 1)减少冲突;首先1e9+7是一个很大的数,int32位的最大值为2147483647,所以对于int32位来说1000000007足够大。int64位的最大值为2^63-1,对于1000000007来说它的平方不会在int64中溢出所以在大数相乘的时候,因为(a∗b)%c=((a%c)∗(b%c))%c,所以相乘时两边都对1000000007取模,再保存在int64里面不会溢出 。其次,1e9+7是一个质数,这个不太懂,可查看原链接。 2)模1e9+7相加不爆int,相乘不爆long long。
另外还有一个点:所以int可以承受10的9次方。该句与上文无关。