• bzoj 3907 网格 bzoj2822 [AHOI2012]树屋阶梯——卡特兰数(阶乘高精度模板)


    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3907

       https://www.lydsy.com/JudgeOnline/problem.php?id=2822

    学到了阶乘高精度的板子。用起来好爽……

    https://www.cnblogs.com/Tunix/p/4354348.html

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #define ll long long
    using namespace std;
    const ll mod=1e8;const int N=1e5+5;
    int n,m,x[N],v[N],p[N],tot;
    ll a[N],b[N];
    ll pw(ll x,int k)
    {
      ll ret=1;while(k){if(k&1)ret*=x;x*=x;k>>=1;}return ret;
    }
    void mul(ll a[],ll b)// a[] is already an iterator
    {
      ll &l=a[0],x=0;
      for(int i=1;i<=l;i++)
        {
          a[i]=a[i]*b+x;
          x=a[i]/mod;a[i]%=mod;
        }
      while(x)a[++l]=x%mod,x/=mod;
    }
    void getc(ll a[],int n,int m)
    {
      memset(x,0,sizeof x);
      for(int i=2;i<=n;i++)x[i]++;
      for(int i=2;i<=m;i++)x[i]--;
      for(int i=2;i<=n-m;i++)x[i]--;
      for(int i=n;i>=2;i--)
        if(!v[i])mul(a,pw(i,x[i]));
        else x[v[i]]+=x[i],x[i/v[i]]+=x[i];//+=x[i]!!!
    }
    void dec(ll a[],ll b[])
    {
      ll &l=a[0];
      for(int i=1;i<=l;i++)
        {
          if(a[i]<b[i])a[i+1]--,a[i]+=mod;
          a[i]-=b[i];
        }
      while(!a[l])l--;
    }
    void print(ll a[])
    {
      int l=a[0];
      printf("%lld",a[l]);
      for(int i=l-1;i;i--)printf("%08lld",a[i]);
      printf("
    ");
    }
    int main()
    {
      scanf("%d%d",&n,&m);
      for(int i=2;i<=n+m;i++)
        {
          if(!v[i])p[++tot]=i;
          for(int j=1,k;j<=tot&&(k=p[j]*i)<=n+m;j++)
        {
          v[k]=p[j];if(i%p[j]==0)break;
        }
        }
      a[0]=a[1]=b[0]=b[1]=1;
      getc(a,n+m,m);
      getc(b,n+m,n+1);
      dec(a,b);
      print(a);
      return 0;
    }
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #define ll long long
    using namespace std;
    const ll mod=1e8;const int N=1e5+5;
    int n,m,x[N],v[N],p[N],tot;
    ll a[N],b[N];
    ll pw(ll x,int k)
    {
      ll ret=1;while(k){if(k&1)ret*=x;x*=x;k>>=1;}return ret;
    }
    void mul(ll a[],ll b)// a[] is already an iterator
    {
      ll &l=a[0],x=0;
      for(int i=1;i<=l;i++)
        {
          a[i]=a[i]*b+x;
          x=a[i]/mod;a[i]%=mod;
        }
      while(x)a[++l]=x%mod,x/=mod;
    }
    void getc(ll a[],int n,int m)
    {
      memset(x,0,sizeof x);
      for(int i=2;i<=n;i++)x[i]++;
      for(int i=2;i<=m;i++)x[i]--;
      for(int i=2;i<=n-m;i++)x[i]--;
      for(int i=n;i>=2;i--)
        if(!v[i])mul(a,pw(i,x[i]));
        else x[v[i]]+=x[i],x[i/v[i]]+=x[i];//+=x[i]!!!
    }
    void dec(ll a[],ll b[])
    {
      ll &l=a[0];
      for(int i=1;i<=l;i++)
        {
          if(a[i]<b[i])a[i+1]--,a[i]+=mod;
          a[i]-=b[i];
        }
      while(!a[l])l--;
    }
    void print(ll a[])
    {
      int l=a[0];
      printf("%lld",a[l]);
      for(int i=l-1;i;i--)printf("%08lld",a[i]);
      printf("
    ");
    }
    int main()
    {
      scanf("%d",&n);m=n;
      for(int i=2;i<=n+m;i++)
        {
          if(!v[i])p[++tot]=i;
          for(int j=1,k;j<=tot&&(k=p[j]*i)<=n+m;j++)
        {
          v[k]=p[j];if(i%p[j]==0)break;
        }
        }
      a[0]=a[1]=b[0]=b[1]=1;
      getc(a,n+m,m);
      getc(b,n+m,n+1);
      dec(a,b);
      print(a);
      return 0;
    }
    稍稍修改后的第二题代码
  • 相关阅读:
    JS 可选链操作符?. 空值合并运算符?? 详解,更精简的安全取值与默认值设置小技巧
    手写一个 Promise
    Leetcode 403 青蛙过河 DP
    Leeetcode 221 最大正方形 DP
    Leetcode 139 单词拆分
    Unity周记: 2021.07.26-08.15
    Unity周记: 2021.07.19-07.25
    Unity周记: 2020.07.12-07.18
    Unity周记: 2020.07.05-07.11
    线性规划
  • 原文地址:https://www.cnblogs.com/Narh/p/9264514.html
Copyright © 2020-2023  润新知