毫无疑问,如果把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;
}