bzoj4807車

来源:互联网 发布:最全p2p网络理财产品 编辑:程序博客网 时间:2024/06/09 15:52

毫无疑问,如果把n行看做一行的话
就相当于在m个位置中取n个
答案就是C(m,n)了
套一发高精度就行了

#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;inline int read(){    int x=0,f=1,ch=getchar();    while(ch<'0'||ch>'9'){if(ch=='-'){f=-1;}ch=getchar();}    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}    return x*f;}struct BigInt{    int a[55],len;    void init()    {        memset(a,0,sizeof(a));        len=50;    }    int& operator [](int x)    {        return a[x];    }    BigInt operator *(const int &b)const    {        BigInt c;c.init();        for(int i=1;i<=50;i++)        {            c[i+1]=(c[i]+a[i]*b)/10;            c[i]=(c[i]+a[i]*b)%10;        }        return c;    }    void print()    {        while(!a[len]) len--;        for(int i=len;i>=1;i--) printf("%d",a[i]);        puts("");    }};int n,m;int pri[1000005],mn[1000005],tail;inline void mk(){    int maxn=max(n,m);    for(int i=2;i<=maxn;i++)    {        if(!mn[i]) mn[i]=i,pri[++tail]=i;        for(int j=1;j<=tail&&pri[j]*i<=maxn;j++)        {            mn[i*pri[j]]=pri[j];            if(i%pri[j]==0) break;        }    }}int cnt[1000005];inline void add(int x){    while(x!=1)    {        cnt[mn[x]]++;        x/=mn[x];    }}inline void del(int x){    while(x!=1)    {        cnt[mn[x]]--;        x/=mn[x];    }}int main(){    n=read(),m=read();mk();    if(n<m) swap(n,m);    for(int i=1;i<=n-m;i++) del(i);    for(int i=m+1;i<=n;i++) add(i);    BigInt ans;ans.init();ans[1]=1;    for(int i=2;i<=n;i++)        while(cnt[i])        {            ans=ans*i;            cnt[i]--;        }    ans.print();    return 0;}
0 0
原创粉丝点击