P10426 [蓝桥杯 2024 省 B] 宝石组合
Leolong2012 · · 题解
题目描述
给定
解题思路
这是一道典型的组合数学问题,我们可以使用组合数公式计算出答案。设
但是,直接使用组合数公式计算时,由于
因此,我们需要寻找一种更加高效的计算组合数的方法。由于本题中需要对结果取模,我们可以使用 Lucas 定理来计算组合数。
Lucas 定理:设
其中,
根据 Lucas 定理,我们可以先将答案分解为模质数的余数,再使用组合数公式计算。
代码实现
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+1;
vector<int>a[N];
int s[N];
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++){
cin>>s[i];
}
sort(s,s+n);
for(int i=0;i<n;i++){
for(int j=1;j<=sqrt(s[i]);j++){
if(s[i]%j==0){
a[j].push_back(s[i]);
if(s[i]/j!=j){
a[s[i]/j].push_back(s[i]);
}
}
}
}
for(int i=N-1;i>=0;i--){
if(a[i].sizae()>=3){
cout<<a[i][0]<<" ";
for(int j=1;j<3;j++){
cout<<a[i][j]<<" ";
}
break;
}
}
return 0;
}