数论+高精度——BZOJ2822/Luogu2532 [AHOI2012]树屋阶梯

来源:互联网 发布:如何设置网络共享权限 编辑:程序博客网 时间:2024/05/22 01:31

题面:BZOJ2822 Luogu2532
首先本题就是Catalan数
Python:暴力直接求100B–
C++:质因数分解+高精度
首先是这个公式:

所以我们直接对1~2n质因数分解一下,然后高精乘单精就可以解决问题了
代码:

#include <cstdio>#include <algorithm>#include <cmath>#include <cstring>#include <iostream>#include <ctime>#include <map>#include <queue>#include <cstdlib>#include <string>#include <climits>#include <set>#include <vector>using namespace std;struct bigint{int c[1001];}ans;bool b[100001];int pri[100001],p[100001],cnt=0;int n,c[100001];inline void get(){    for(int i=2;i<=2*n;i++){        if(!b[i])p[i]=++cnt,pri[cnt]=i;        for(int j=1;j<=cnt;j++){            if(i*pri[j]>2*n)break;            b[i*pri[j]]=1;p[i*pri[j]]=j;            if(i%pri[j]==0)break;        }    }}inline void add(int x,int k){    while(x!=1)c[p[x]]+=k,x/=pri[p[x]];}inline void shuchu(bigint a){    for(int i=a.c[0];i;i--)printf("%d",a.c[i]);    puts("");}inline bigint cheng(bigint a,int b){    for(int i=1;i<=a.c[0];i++)a.c[i]*=b;    for(int i=1;i<=a.c[0];i++)if(a.c[i]>9){        a.c[i+1]+=a.c[i]/10;a.c[i]%=10;        if(i==a.c[0])a.c[0]++;    }    return a;}int main(){    scanf("%d",&n);    get();    for(int i=n+1;i<=2*n;i++)add(i,1);    for(int i=1;i<=n+1;i++)add(i,-1);    ans.c[0]=ans.c[1]=1;    for(int i=1;i<=100000;i++)while(c[i])ans=cheng(ans,pri[i]),c[i]--;    shuchu(ans);    return 0;}
原创粉丝点击