888. 求组合数 IV 高精度
Posted 幽殇默
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了888. 求组合数 IV 高精度相关的知识,希望对你有一定的参考价值。
https://www.acwing.com/problem/content/description/890/
#include<cstdio>
#include<iostream>
#include<vector>
using namespace std;
const int N=5010;
int primes[N];
int sum[N];
int cnt;
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)
{
int t=0;
vector<int> C;
for(int i=0;i<a.size()||t;i++)
{
if(i<a.size()) t+=a[i]*b;
C.push_back(t%10);
t=t/10;
}
return C;
}
int main(void)
{
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(b,p)-get(a-b,p);// 组合数 a! 除 b! 和 (a-b)! 故需要减
}
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];
cout<<endl;
return 0;
}
以上是关于888. 求组合数 IV 高精度的主要内容,如果未能解决你的问题,请参考以下文章