可能需要报课才能做
题目:https://www.acwing.com/problem/content/890/wzw
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e6+9;
int prime[N];
int vis[N];
int cnt;
int sum[N];
void init(int n){ //线性筛
vis[0]=vis[1]=1;
for(int i=2;i<=n;i++){
if(vis[i]==0)prime[cnt++]=i;
for(int j=0;prime[j]*i<=n;j++){
vis[prime[j]*i]=1;
if(i%prime[j]==0)break;
}
}
return ;
}
int get(int n,int p){ //看这个阶乘里面包含多少个p因数
int res=0;
while(n){
res+=n/p;
n=n/p;
}
return res;
}
vector<int> mul(vector<int>vec,int p){ //高精度乘法,大数乘以正常数
int t=0;
vector<int>temp; //新建一个过渡的容器
for(int i=0;i<vec.size();i++){
t+=vec[i]*p;
temp.push_back(t%10);
t=t/10;
}
while(t){ //如果t还存在数,就继续加入容器
temp.push_back(t%10);
t=t/10;
}
return temp; //返回这个过渡容器
}
int main()
{
int a,b;
cin>>a>>b;
init(a);
for(int i=0;i<cnt;i++){ //质因分解
int p=prime[i];
sum[i]=get(a,p)-get(b,p)-get(a-b,p);//存下保留下来的p的个数
}
vector<int>vec; //申请一个容器,用来进行高精度乘法
vec.push_back(1);
for(int i=0;i<cnt;i++){
for(int j=0;j<sum[i];j++){
vec=mul(vec,prime[i]);
}
}
int pos=vec.size()-1;
while(pos>=0){
printf("%d",vec[pos--]);
}
return 0;
}