求解巨大卡特兰数 C++实现(高精度乘法,质因数)

katelan
计算卡特兰数由于结果会非常大,所以采用vector来对数据进行存储,同时使用高精度乘法来对结果进行运算。

输入样例1:

3

输出样例1:

5

输入样例2:

60000

输出样例2:

15264047992826020890059564020503619491920807903813203631701630729178036601123431956081763172005086064437378171085856348270195047840322071315586249468037063288912924833521206447385223239815754849499430814317553488695989395939016034717754954930597629301403451877250855583453035658343037751056147516168262728613125621440457080187728699516015251580361480317234583552773304925662093710049500591880706526645287027843825853026838506326866069089340880675086110643078873199743607812046377269374830636931064022624158937842060715653756350289282105457900557447999019182958410846000075036048311439244390201017502561676011762161832610362081994413479473481747588631024228210022107194711586639020572840657026801356342349301970983845620590307890042640429652223447156259254085950978990838128967404108642194340566399015409237792443321836101739258225146297277707673259590481787041226512699580609879223048416896611198388926871118042237445798575218190889507697324073353469572153216379846717154657084359877443217220407891463237108631971711322423415737513715700712285185578723408056343704908012524522932357252401532294386838536606841885157332377650632598830806612356849675726861433471565810188421895161022690809142280631255727551567322355154316032031334682592881832711438914600881625986841786930606938465526747750162136733777615656940880630175322763063686713429600942869909882006324890992600757021249755170962532342659581409251101257611299380096201893747672619158693361173120345837335752172951108979801508486303760881776110521794874947049384526009316581930762889307835299763467364886716277043656364444946361836692808460373292943418902092350513972249633333526315775563488757450379964456736515808264879905004230534593781109574894456520360597033088396117407191537407960084755896129937422580364645350970923043175275608553863063034185304820099728882348076087091046847607369447602839182479597758200220394528783218627278505381295925388754693014512295336206969242636542407402296640430007153452676943101104162142084655623250701393…

#include<bits/stdc++.h>
using namespace std;

const int N = 6e5+10,mod = 1e8;   //采用long long int 进行压缩,加快运行速度
typedef long long LL;
int primes[N],co;
bool st[N];
void p(int n)
{
    co=0;   
    for(int i=2;i<=n;i++)
    {
        if(!st[i]) primes[co++]=i;
        for(int j=0;primes[j]<=n/i;j++)
        {
            st[primes[j]*i]=1;
            if(i % primes[j]==0) break;
        }
    }
}

int calc(int n,int pr)
{
    int s=0;
    while(n>0)
    {
        s+=n/pr;
        n/=pr;
    }
    return s;
}

vector<LL> mul(vector<LL> a,int b)   //高精度乘法计算结果
{
    vector<LL> c;
    LL t=0;
    for(int i=0;i<a.size();i++)
    {
        t+=a[i]*b;
        c.push_back(t%mod);
        t/=mod;
    }
    while(t)
    {
        c.push_back(t%mod);
        t/=mod;
    }
    return c;
}

int main()
{
        int a,b,n; 
        scanf("%d",&n);
        a = 2*n,b=n;
        p(a);
        int num[N];
        for(int i=0;i<co;i++)
        {
            int pr = primes[i];
            num[i] = calc(a,pr) - 2*calc(b,pr); 
        }
        int k=n+1;
        for(int i=0;i<co && primes[i]<=k;i++)
        {
        	int pr = primes[i],sum=0;
        	while(k%pr==0)
        	{
        		sum++;
        		k/=pr;
			}
			num[i]-=sum;
		}
		
        vector<LL> ans;
        ans.push_back(1);
        for(int i=0;i<co;i++)
        {
            while(num[i]--) ans = mul(ans,primes[i]);
        }
        printf("%lld",ans.back());
        for(int i=ans.size()-2;i>=0;i--) printf("%08lld",ans[i]);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jay_fearless

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值