【51nod 1556】计算(默慈金数)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Coldfresh/article/details/83660508

描述:
有一个1n的矩阵 固定第一个数为1 其他填正整数 且相邻数的差不能超过1 求方案数%1e9+7的结果
输入
一个数n 表示1
n的矩阵(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}
代码:

#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;
}

猜你喜欢

转载自blog.csdn.net/Coldfresh/article/details/83660508