1 条题解

  • 0
    @ 2026-4-27 22:47:02

    这边提供一种简单的 dfs 剪枝做法。

    dfs 接收两个参数:当前素数的下标和目前的乘积。对于当前元素,尝试不同幂次,计算新的乘积,继续递归。

    然后考虑优化与剪枝。
    优化:从大到小枚举质数 reverse(v.begin(),v.end());
    剪枝:当 n/x=ans/xn / x = ans / x 时,即使继续对 xx 进行后续的搜索操作,也无法得到比 ansans 更大的值。

    具体可以看代码和注释。 ::::success[代码]

    #include<bits/stdc++.h>
    using namespace std;
    #define int unsigned long long//防止超限
    int n,k,a,ans;
    vector<int> v;
    void dfs(int i,int x){//i 表示 v 数组中的元素索引,x 表示当前的乘积 
    	ans=max(ans,x);
        if(i>=v.size()) return;//已经处理完所有元素
        if(n/x==ans/x) return;//继续搜索下去也不会得到比 ans 更大的结果
        int temp=1;//当前元素的不同幂次
        while(1){
            int nx=x*temp;
            if(nx>n) break;//继续乘下去会超出范围
            dfs(i+1,nx);//递归处理下一个元素,同时更新乘积
            temp*=v[i];//尝试下一个幂次
        }
    }
    signed main(){
    	ios::sync_with_stdio(0);
    	cin.tie(0);
    	cout.tie(0);
    	cin >> k >> n;
    	for(int i=0;i<k;i++){
    		cin >> a;
    		v.push_back(a);
    	}
    	ans=1;
    	reverse(v.begin(),v.end());//从大到小枚举质数 
    	dfs(0,1);
    	cout << ans;
    	return 0;
    }
    
    

    ::::

    • 1

    信息

    ID
    11016
    时间
    10000ms
    内存
    8MiB
    难度
    10
    标签
    递交数
    2
    已通过
    1
    上传者