[AcWing 4486] 数字操作
数论 + 贪心
点击查看代码
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 1e6 + 10;
int n;
void solve()
{
cin >> n;
int res = 1, m = 0;
vector<int> a;
for (int i = 2; i <= n / i; i ++) {
if (n % i == 0) {
int c = 0;
while (n % i == 0) {
n /= i;
c ++;
}
res *= i;
a.push_back(c);
while (1 << m < c)
m ++;
}
}
if (n > 1) {
res *= n;
a.push_back(1);
}
for (auto x : a) {
if (x < 1 << m) {
m ++;
break;
}
}
cout << res << ' ' << m << endl;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
solve();
return 0;
}
- 最小值(数论)
由算数基本定理,,所有的次方都可以通过乘一个数之后然后开方除掉,最小值即为 - 最少操作次数(贪心)
先做一次乘法,将所有因数 都变成 ,然后再做 次开方,操作次数是最少的,原因如下:
任意的 (可以开方),如果先开方,得到的是 ,然后再乘以一个 ,最终得到 ,如果采取先乘以一个 ,得到 ,然后再开方,得到的也是
也就是说所有先开方后乘的操作都可以用先乘后开方的操作来代替,由于乘法具有交换律,可以把所有的乘法移到算式最前面,合成一个乘法,做完这一次乘法之后再开方,一定可以保证操作次数最少
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!