题目链接
题目描述
你有一个长度为 n 的数组 a ,其中每个元素都是正整数。
现在你可以执行最多 k 次操作,每次操作可以将一个元素除以一个它的质因子。例如,如果 a[3] = 6 ,执行一次除以 3 的操作后, a[3] = 2 。
请问在最多执行 k 次操作的前提下,数组 a 所有元素的乘积的最小值是多少。由于这个数可能很大,请输出这个数对 取模后的结果。
输入描述:
第一行输入两个正整数 。
第二行输入 n 个整数,表示数组 。
输出描述:
输出一个整数表示对 取模后的答案。
输入
6 3
1 1 4 5 1 4
输出
4
解题思路
这里我直接将所有的输的质因子全部分解出来,用的办法就是常用的分解质因子的模板(稍作修改)。
然后,每输入一个数,就将其分解质因子并添加到vector当中,然后再将所有的质因子降序排序:
sort(v.begin(), v.end(), greater<ll>())
最后在处理取模运算时,切记不能将结果算出再取模,否则会爆。所以应该一边求解,一边处理取模,两种方法结果一致,可以自己举几个例子算一下,和快速幂的处理相似。
AC代码
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N = 200010;
int a[N];
ll mod = 1e9 + 7;
vector<int> v;
void divide(int n)
{
for(int i=2;i<=n/i;i++)
{
if(n % i == 0)
{
while(n%i == 0)
{
n/=i;
v.push_back(i);
}
}
}
if(n > 1)
{
v.push_back(n);
}
return ;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
ll n,k;
cin>>n>>k;
for(int i=1;i<=n;i++)
{
cin>>a[i];
divide(a[i]);
}
sort(v.begin(), v.end(), greater<ll>());
int res = 1;
for(int i = k; i < v.size(); i++)
{
res = res * v[i] % mod;
}
cout<<res;
return 0;
}