888. 求组合数 IV
题目链接https://www.acwing.com/problem/content/890/
题目:
思路:先求出分子和分母的各质素之比,然后进行高精度计算
具体的做法:筛素数(1~5000),然后求每个质数的次数,最后用高精度乘把所有质因子乘上
#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
int primes[5000],ct[5000];
bool vis[5000];
int cnt=0;
void get_primes(int a){
for(int i=2;i<=a;i++){
if(!vis[i]) primes[cnt++]=i;
for(int j=0;primes[j]*i<=a;j++){
vis[primes[j]*i]=1;
if(i%primes[j]==0) break;
}
}
}
int get(int a,int b){
int res=0;
while(a){
res+=a/b;
a/=b;
}
return res;
}
vector<int> mul(vector<int> a,int b){
vector<int> q;
int t=0;
for(int i=0;i<a.size();i++){
t+=a[i]*b;
q.push_back(t%10);
t/=10;
}
while(t){
q.push_back(t%10);
t/=10;
}
return q;
}
int main(){
int a,b;
cin>>a>>b;
get_primes(a);
for(int i=0;i<cnt;i++){
ct[i]=get(a,primes[i])-get(b,primes[i])-get(a-b,primes[i]);
}
vector<int > q;
q.push_back(1);
for(int i=0;i<cnt;i++){
for(int j=0;j<ct[i];j++)
q=mul(q,primes[i]);
}
for(int i=q.size()-1;i>=0;i--){
printf("%d",q[i]);
}
return 0;
}
求组合数的方法总结https://blog.csdn.net/weixin_46028214/article/details/115920131