• 数学整合 新(LUOGU)


    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; }
  • 相关阅读:
    第五十四天:jQuery内容的基础:
    第五十三天dom基础
    第五十二天js的&#183;进阶
    第五十一天js的基础
    第四十九天css进阶
    第四十八天 html中的form和css基础
    第四十七天:web中德html初级:
    第42天IO模块
    第四十一天:协程操作
    第四十天线程的进阶
  • 原文地址:https://www.cnblogs.com/Slager-Z/p/9901726.html
Copyright © 2020-2023  润新知