描述:
有一个1n的矩阵 固定第一个数为1 其他填正整数 且相邻数的差不能超过1 求方案数%1e9+7的结果
输入
一个数n 表示1n的矩阵(n<=10^6)
输出
一个数 表示方案数%1e9+7的结果
输入样例
3
输出样例
5
用到一个叫默慈金数的东西,具体描述自行百度。给出递推关系式子。
M
n
=
(
2
n
+
1
)
M
n
−
1
+
(
3
n
−
3
)
M
n
−
2
n
+
2
M_{n}=\frac{(2n+1)M_{n-1}+(3n-3)M_{n-2}}{n+2}
Mn=n+2(2n+1)Mn−1+(3n−3)Mn−2
代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
#include<queue>
#define maxn 1000005
#define ll long long
#define mod 1000000007
using namespace std;
ll P(ll a,ll b)
{
ll ans=1;
while(b)
{
if(b&1)ans=ans*a%mod;
a=a*a%mod;
b>>=1;
}
return ans;
}
ll m[maxn],ans[maxn];
void init()
{
m[1]=1,m[2]=2;
for(int i=3;i<maxn;i++)
{
m[i]=(2*i+1)*m[i-1]%mod+(3*i-3)*m[i-2]%mod;
m[i]=m[i]%mod*P(i+2,mod-2)%mod;
}
ans[1]=1;
ans[2]=2;
for(int i=3;i<maxn;i++)ans[i]=(3*ans[i-1]%mod-m[i-2]+mod)%mod;
}
int main()
{
init();
int n;cin>>n;cout<<ans[n]<<endl;
return 0;
}