B - 健康阳光,积极向上!

176 阅读1分钟

题目链接

题目描述

你有一个长度为 n 的数组 a ,其中每个元素都是正整数。

现在你可以执行最多 k 次操作,每次操作可以将一个元素除以一个它的质因子。例如,如果 a[3] = 6 ,执行一次除以 3 的操作后, a[3] = 2 。

请问在最多执行 k 次操作的前提下,数组 a 所有元素的乘积的最小值是多少。由于这个数可能很大,请输出这个数对 109+710^9 + 7 取模后的结果。

输入描述:

第一行输入两个正整数 n,k(1n2×105,1k109)n,k(1≤n≤2×10^5,1≤k≤10^9)

第二行输入 n 个整数,表示数组 a(1ai2×105)a(1≤a_i≤2×10^5)

输出描述:

输出一个整数表示对 109+710^9+7 取模后的答案。

输入

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;
}