首页 > 其他分享 >火车进栈 (卡特兰数+位压高精)

火车进栈 (卡特兰数+位压高精)

时间:2023-12-03 16:12:49浏览次数:26  
标签:int long 高精 位压 ans 进栈 卡特兰

火车进栈

(卡特兰数+位压高精)


[题目](130. 火车进出栈问题 - AcWing题库)

思路:车厢进出栈视为\(01\)序列,则每种\(01\)序列对应一种出栈顺序,答案即为:\({\Large \frac{1}{n+1} C_{2n}^{n}}\)

数据范围:\(1{\Large \le }n{\Large \le }60000\)(数据开到\(2n\),因为这个卡了一小时qwq

考虑对\(n!\)进行质因数分解,用位压高精度计算,注意输出时补\(0\)

#pragma GCC optimize(3) 
#include<bits/stdc++.h>
#define int long long
using namespace std;
typedef long long LL;
const int N=1.2e5+10;
const LL base=1e12;//位压基准

int n,idx,pri[N];
bool st[N];
vector<LL> ans;

void mul(vector<int> &A,int b)
{
    LL t=0;
    for(int i=0;i<A.size();++i)
    {
        t+=A[i]*b;
        A[i]=t%base;
        t/=base;
    }
    while(t) {A.push_back(t%base);t/=base;}
}

void get_pri(int n)//线性筛
{
    for(int i=2;i<=n;++i)
    {
        if(!st[i]) pri[idx++]=i;
        for(int j=0;pri[j]<=n/i;++j)
        {
            st[pri[j]*i]=1;
            if(i%pri[j]==0) break;
        }
    }
}

int pri_num(int x,int p)//求n!中p因数个数
{
    int res=0;
    while(x)
    {
        res+=x/p;
        x/=p;
    }
    return res;
}

signed main()
{
    cin>>n;
    get_pri(n*2);
    
    ans.push_back(1);
    for(int i=0;i<idx;++i)
    {
        int num=pri_num(2*n,pri[i])-pri_num(n,pri[i])*2;
        int t=n+1;
        while(t%pri[i]==0) {num--;t/=pri[i];}
        while(num--) mul(ans,pri[i]);
    }
    cout<<ans.back();
    for(int i=ans.size()-2;i>=0;--i)
        printf("%012lld",ans[i]);
    return 0;
}

标签:int,long,高精,位压,ans,进栈,卡特兰
From: https://www.cnblogs.com/everflame/p/17873302.html

相关文章

  • 高精度模板
    高精度加法#include<bits/stdc++.h>usingnamespacestd;constintL=11010;stringadd(stringa,stringb)//只限两个非负整数相加{ stringans; intna[L]={0}; intnb[L]={0}; intla=a.size(); intlb=b.size(); for(inti=0;i<la;i++)na[la......
  • 卡特兰数专题(Catalan)
    卡特兰数专题(\(Catalan\))一、什么是卡特兰数?明安图数,又称卡塔兰数,英文名\(Catalan\)\(number\),是组合数学中一个常出现于各种计数问题中的数列。以中国蒙古族数学家明安图\((1692-1763)\)和比利时的数学家欧仁·查理·卡塔兰\((1814–1894)\)的名字来命名,其前几项为(从第零项开......
  • 高精度算法总结
    高精度加法题目链接:https://www.acwing.com/activity/content/problem/content/825/代码模版:1#include<iostream>2#include<vector>34usingnamespacestd;56//C=A+B7vector<int>add(vector<int>&A,vector<int>&......
  • 5G+车联网加速融合,看华测导航车高精度模组如何抢占市场高地!
     近年来,智能汽车领域的关注度一直居高不下,打开微博,经常可以看到华为汽车、比亚迪等热门车型的讨论。事实上,随着新能源汽车的快速崛起,汽车行业实现了智能化转型。目前,我国作为全球最大的车辆及出行服务市场,未来在智能驾驶应用领域有着广阔的发展空间,L2+辅助驾驶已逐步成为我国发......
  • spring boot工业互联网高精度位置信息服务平台源码
    UWB定位系统源码,UWB人员定位系统全套源码行业背景工业企业多存在很多有毒有害、高危高压等生产环境,带电设备众多,容易发生安全事故;人员只能凭记忆遵守各项生产安全规范,如某些危险区域范围、带电体的安全距离、各项作业的规范;一旦疏忽后果严重,安全作业无后盾;生产安全的重点区域,无全方......
  • 高精度板子
    高精度模板copy老师的代码@_xuefeng#include<bits/stdc++.h>usingnamespacestd;charch[500000];structnode{ints[1000000],len;voidinit(){scanf("%s",ch+1);len=strlen(ch+1);for(inti=1;i<=len;++i)s[len-i+1......
  • 【开源】int,long long去一边去:高精度大合集!
    加法\(add\)stringadd(strings1,strings2){//时间复杂度O(logn)stringres="";intcarry=0,i=0;while(i<int(s1.size())||i<int(s2.size())||carry>0){inta=(i<int(s1.size()))?(s1[int(s1.size())-i-1]-'0'......
  • 高精度模版
    高精度加法vector<int>add(vector<int>&A,vector<int>&B){//654321654321vector<int>C;inttemp=0;for(inti=0;i<A.size()||i<B.size();++i){if(i<A.size())temp+=A[i];......
  • 写了个高精度加法板子
    #include<bits/stdc++.h>using namespace std;const int N=1e4+9;int a1[1000],b1[1000],ans[1000];void add(int a[],int b[],int na,int nb){int t=0;if(na<nb)return add(b,a,nb,na);for(int i=0;i<na;i++){t+=a[i];if(i<nb)t+=b[i];ans[i]=t%10;t/=10;}if(......
  • 卡特兰数专题(Catalan)
    卡特兰数专题(\(Catalan\))一、什么是卡特兰数?明安图数,又称卡塔兰数,英文名\(Catalan\)\(number\),是组合数学中一个常出现于各种计数问题中的数列。以中国蒙古族数学家明安图\((1692-1763)\)和比利时的数学家欧仁·查理·卡塔兰\((1814–1894)\)的名字来命名,其前几项为(从第零项......