CHOI1001/1002 火车进出栈问题

众所周知答案为C(N,2*N)/(N+1)。

由于本juruo太弱,不会高精除法,只会质因数分解。复杂度多了个sqrt(N)?

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a[1000100];
ll t[120100],len=1;
void chen(ll x){
    for(ll i=1;i<=len;++i)a[i]=a[i]*x;
    for(ll i=1;i<=len;++i){
        a[i+1]+=a[i]/10;
        a[i]%=10;
        if(a[len+1])++len;
    }
}
int main(){
    ll n;
    scanf("%lld",&n);
    for(ll i=2*n;i>=n+2;--i){
        ll k=i,m=sqrt(k+1);
        for(ll j=2;j<=m;++j){
            while(k%j==0)k/=j,t[j]++;
        }
        if(k!=1)t[k]++;
    }
    for(ll i=1;i<=n;++i){
        ll k=i,m=sqrt(k+1);
        for(ll j=2;j<=m;++j){
            while(k%j==0)k/=j,t[j]--;
        }
        if(k!=1)t[k]--;
    }
    a[1]=1;
    for(ll i=1;i<=120100;++i){
        for(ll j=1;j<=t[i];++j){
            chen(i);
        }
    }
    for(ll i=len;i>=1;--i)printf("%lld",a[i]);
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/Dream-Runner/p/10152277.html