莫欺少年穷,修仙之旅在这开始—>算法基础课题解
思路:
1. 获取所有的质因子
2. 计算出每个质因子的个数
3. 用高精度乘法得出答案
重要公式:
$a!$ 中质因子 $p$ 的个数 $cnt=\left\lfloor\dfrac{a}{p}\right\rfloor+\left\lfloor\dfrac{a}{p^2}\right\rfloor+\left\lfloor\dfrac{a}{p^3}\right\rfloor+…$
$C_a^b=\dfrac{a!}{(a-b)!\cdot b!}$,将其转换为 $\prod\limits_{i=1}^k{p_i^{a_i}}$ 的格式,然后用高精度乘法计算
可参考: 阶乘分解
#include<bits/stdc++.h>
using namespace std;
const int N = 5010;
int primes[N],cnt;
int sum[N];
bool st[N];
void get_primes(int n)
{
for(int i=2;i<=n;i++)
{
if(!st[i]) primes[cnt++]=i;
for(int j=0;primes[j]<=n/i;j++)
{
st[primes[j]*i]=true;
if(i%primes[j]==0) break;
}
}
}
int get(int n,int p)
{
int res=0;
while(n)
{
res+=n/p;
n/=p;
}
return res;
}
vector<int> mul(vector<int> a,int b)
{
vector<int> c;
for(int i=0,t=0;i<a.size()||t;i++)
{
if(i<a.size()) t+=a[i]*b;
c.push_back(t%10);
t/=10;
}
return c;
}
int main()
{
int a,b;
cin>>a>>b;
//获取所有质因子
get_primes(a);
//计算每个质因子的个数
for(int i=0;i<cnt;i++)
{
int p=primes[i];
sum[i]=get(a,p)-get(a-b,p)-get(b,p);
}
//高精度乘法
vector<int> res;
res.push_back(1);
for(int i=0;i<cnt;i++)
for(int j=0;j<sum[i];j++)
res=mul(res,primes[i]);
for(int i=res.size()-1;i>=0;i--) cout<<res[i];
return 0;
}