[AcWing 4486] 数字操作

image
image

数论 + 贪心


点击查看代码
#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;   
}

  1. 最小值(数论)
    由算数基本定理,ai=P1α1P2α2Pkαk,所有的次方都可以通过乘一个数之后然后开方除掉,最小值即为 P1P2Pk
  2. 最少操作次数(贪心)
    先做一次乘法,将所有因数 Piαi 都变成 Pi2m ,然后再做 m 次开方,操作次数是最少的,原因如下:
    任意的 x(可以开方),如果先开方,得到的是 x,然后再乘以一个 t,最终得到 xt,如果采取先乘以一个 t2,得到 xt2,然后再开方,得到的也是 xt
    也就是说所有先开方后乘的操作都可以用先乘后开方的操作来代替,由于乘法具有交换律,可以把所有的乘法移到算式最前面,合成一个乘法,做完这一次乘法之后再开方,一定可以保证操作次数最少
posted @   wKingYu  阅读(20)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
欢迎阅读『[AcWing 4486] 数字操作』
点击右上角即可分享
微信分享提示