ans[n]=ans[n-1]*3-m[n-2];YY一下可以懂的。减掉的就是往下走的情况不符合正整数的情况。m是默慈金数。
#include<cstdio>
#include<cstring>
#include<cctype>
#include<algorithm>
using namespace std;
#define rep(i,s,t) for(int i=s;i<=t;i++)
#define dwn(i,s,t) for(int i=s;i>=t;i--)
#define clr(x,c) memset(x,c,sizeof(x))
#define ll long long
const int mod=1e9+7;
const int nmax=1e6+5;
ll inv[nmax],ans[nmax],m[nmax];
int main(){
int n;scanf("%d",&n);
inv[1]=1;
rep(i,2,n+3) inv[i]=(mod-mod/i)*inv[mod%i]%mod;
m[1]=1;m[2]=2;
rep(i,3,n) m[i]=((i*2+1)*m[i-1]%mod+3*(i-1)*m[i-2]%mod)%mod*inv[i+2]%mod;
ans[1]=1;ans[2]=2;
rep(i,3,n) ans[i]=(3*ans[i-1]%mod-m[i-2]+mod)%mod;
printf("%d\n",ans[n]);
return 0;
}
有一个1*n的矩阵 固定第一个数为1 其他填正整数 且相邻数的差不能超过1 求方案数%1e9+7的结果
Input
一个数n 表示1*n的矩阵(n<=10^6)
Output
一个数 表示方案数%1e9+7的结果
Input示例
3
Output示例
5