bzoj2729-[HNOI2012]排队

初赛难度组合题。

\[ Ans = A_n^n * ( A_{n+1}^{2} * A_{n+3}^{m} + A_{m}^{1} * A_{2}^{2} * A_{n+1}^{1} * A_{n+2}^{m-1} ) \]

需要高精度。

另外,\(A_n^m\) ,当\(n < m\)时返回0.

#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<set>
#include<map>
using namespace std;
#define rep(i,l,r) for(register int i=(l);i<=(r);++i)
#define repdo(i,l,r) for(register int i=(l);i>=(r);--i)
#define il inline
typedef double db;
typedef long long ll;

//---------------------------------------
const int bsz=20050,blk=10000;
struct tbig{
    int val[bsz];
    tbig(){cl();}
    tbig(int v){set(v);}
    void cl(){memset(val,0,sizeof(val));}
    void set(int v){
        cl();
        while(v){val[++val[0]]=v%blk;v/=blk;}
    }
    int& operator[](int p){return val[p];}
    const int& operator[](int p)const{return val[p];}
    void pr(){
        printf("%d",val[val[0]]);
        repdo(i,val[0]-1,1){
            printf("%04d",val[i]);
        }
    }
};
typedef const tbig& ftbig;
tbig operator+(ftbig l,ftbig r){
    tbig res;
    res[0]=max(l[0],r[0]);
    rep(i,1,res[0]){
        res[i]+=l[i]+r[i];
        if(res[i]>blk)res[i]-=blk,res[i+1]++;
    }
    while(res[res[0]+1])++res[0];
    return res;
}
tbig operator*(ftbig l,ftbig r){//no fft,no bugs
    tbig res;
    rep(i,1,l[0]){
        rep(j,1,r[0]){
            res[i+j-1]+=l[i]*r[j];
            if(res[i+j-1]>blk)res[i+j]+=res[i+j-1]/blk,res[i+j-1]%=blk;
        }
    }
    res[0]=l[0]+r[0]+1;
    while(res[res[0]]==0&&res[0])--res[0];
    return res;
}
tbig a(int a,int b){
    if(b>a)return 0;
    tbig res(1);
    rep(i,1,b)res=res*(a-i+1);
    return res;
}
int n,m;
tbig res;
int main(){
    ios::sync_with_stdio(0),cin.tie(0);
    cin>>n>>m;
    res=a(n,n)*(a(n+1,2)*a(n+3,m)+a(m,1)*a(2,2)*a(n+1,1)*a(n+2,m-1));
    res.pr();
    return 0;
}

转载于:https://www.cnblogs.com/ubospica/p/9838867.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值