1.卡特兰数(P2532)
递推式:h(n)=C(2n,n)/(n+1) (n=0,1,2,...)
前十项(从零开始):1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862,
int n;
unsigned long long a[550<<1];
int main(){
n=read();
a[0]=1; a[1]=1;
for(rint i=2;i<=n+n;i++) a[i]=1ull*a[i-1]*i;
unsigned long long ans=a[n+n]/a[n]/a[n]/(n+1);
cout<<ans<<endl;
return 0;
}
2.第二类斯特林数(P3904)
s(n,0)=0^n; s(n,1)=s(n,n)=1; s(n,m)=s(n-1,m-1)+m*s(n-1,m);
//不加高精
int n,m;
int f[51][51];
int main(){
n=read();m=read();
memset(f,0,sizeof(f));
for(rint i=1;i<=n;i++) f[i][1]=1;
for(rint j=2;j<=m;j++)
for(rint i=1;i<=n;i++)
f[i][j]=f[i-1][j-1]+j*f[i-1][j];
cout<<f[n][m];
return 0;
}
//使用高精
int n,m;
long long f[51][51][1010]={0};
inline void update(int u,int v){
for(rint i=1;i<=max(f[u-1][v-1][0],f[u-1][v][0]);i++)
f[u][v][i]+=f[u-1][v-1][i]+f[u-1][v][i]*v;
f[u][v][0]=max(f[u-1][v][0],f[u-1][v-1][0]);
for(rint i=1;i<=f[u][v][0];i++)
f[u][v][i+1]+=f[u][v][i]/10,
f[u][v][i]=f[u][v][i]%10;
while(f[u][v][f[u][v][0]+1]){
f[u][v][0]++;
f[u][v][f[u][v][0]+1]+=f[u][v][f[u][v][0]]/10;
f[u][v][f[u][v][0]]%=10;
}
}
int main(){
n=read();m=read();
memset(f,0,sizeof(f));
f[1][1][0]=1;f[1][1][1]=1;
for(rint i=2;i<=n;i++)
for(rint j=1;j<=i;j++)
update(i,j);
if(f[n][m][0]==0){
printf("0
");
return 0;
}
for(rint i=f[n][m][0];i>=1;i--)
cout<<f[n][m][i];
cout<<endl;
return 0;
}
3.斐波那契数列(P1962)
Fib[i]=Fib[i-1]+Fib[i-2](Fib[0]=1,Fib[1]=1);
//矩阵乘法
struct matrix{ long long m[5][5];}a,b,ans;
long long n;
const int md=1e9+7;
inline matrix mul(matrix a,matrix b){
matrix ans;
for(rint i=1;i<=2;i++)
for(rint j=1;j<=2;j++){
ans.m[i][j]=0;
for(rint k=1;k<=2;k++)
ans.m[i][j]=(ans.m[i][j]+a.m[i][k]*b.m[k][j])%md;
}
return ans;
}
inline matrix matpow(matrix a,long long b){
matrix ans=a;b--;
while(b){
if(b&1) ans=mul(ans,a);
a=mul(a,a);
b>>=1;
}
return ans;
}
int main(){
cin>>n;
if(n<=2){ printf("1
");return 0;}
a.m[1][1]=1;a.m[2][1]=1;a.m[1][2]=0;a.m[2][2]=0;
b.m[1][1]=1;b.m[1][2]=1;b.m[2][1]=1;b.m[2][2]=0;
b=matpow(b,n-1);
ans=mul(a,b);
cout<<ans.m[2][1]<<endl;//输出的是下面的f(n) 上面的是f(n+1)
return 0;
}