1 条题解
-
0
这边提供一种简单的 dfs 剪枝做法。
dfs 接收两个参数:当前素数的下标和目前的乘积。对于当前元素,尝试不同幂次,计算新的乘积,继续递归。
然后考虑优化与剪枝。
优化:从大到小枚举质数reverse(v.begin(),v.end());。
剪枝:当 时,即使继续对 进行后续的搜索操作,也无法得到比 更大的值。具体可以看代码和注释。 ::::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
- 上传者