我也不知道我是不是糖丸

news/2024/10/15 13:30:02

模拟赛碰到一个很纸张的题目,但是自己没有做出来,于是记一下。

description

pAtW74J.png

\(1 \le n, a_i \le 3 \times 10^5\)

solution

首先场上我写了一个很典的暴力做法。

考虑到预处理出所有阶乘的质因子幂次,然后相当于我从大往小枚举,能除多少就除多少,这样肯定能够满足字典序最大,然后发现除法对应到质因子幂次上就变成了减法,于是就变成了一个求最大的 \(c\) 使得 \(a - c \times b \ge 0\),直接除一下就做完了,放带代码:

#include <bits/stdc++.h>
#define int long longusing namespace std;const int N = 3e5 + 5;int n;
int a[N], prime[N];
vector < int > p;
vector < pair < int, int > > ans;
vector < int > chifan[N], szy;void init () {for ( int i = 2; i <= 7000; i ++ ) {if ( !prime[i] ) {for ( int j = i + i; j <= 7000; j += i ) {prime[j] = 1;}}}
}signed main () {freopen ( "secure.in", "r", stdin );freopen ( "secure.out", "w", stdout );ios :: sync_with_stdio ( false );cin.tie ( 0 ), cout.tie ( 0 );cin >> n;init ();for ( int i = 2; i <= 7000; i ++ ) {if ( !prime[i] ) {p.push_back ( i );}}for ( int i = 2; i <= 7000; i ++ ) {int tmp = i;for ( int j = 0; j < p.size (); j ++ ) {int cnt = 0;while ( tmp % p[j] == 0 ) {cnt ++;tmp /= p[j];}chifan[i].push_back ( cnt );}}for ( int i = 3; i <= 7000; i ++ ) {for ( int j = 0; j < p.size (); j ++ ) {chifan[i][j] += chifan[i - 1][j];}}for ( int i = 0; i < p.size (); i ++ ) {szy.push_back ( 0 );}for ( int i = 1; i <= n; i ++ ) {cin >> a[i];if ( a[i] != 1 ) {for ( int j = 0; j < p.size (); j ++ ) {szy[j] += chifan[a[i]][j];}}}for ( int i = 7000; i >= 2; i -- ) {int mini = 1e18;for ( int j = 0; j < p.size (); j ++ ) {if ( chifan[i][j] ) {mini = min ( mini, szy[j] / chifan[i][j] );}}if ( mini ) {ans.push_back ( { i, mini } );for ( int j = 0; j < p.size (); j ++ ) {szy[j] -= mini * chifan[i][j];}}}cout << ans.size () << '\n';for ( pair < int, int > x : ans ) {cout << x.first << " " << x.second << '\n';}return 0;
}

但是很明显,这样做是 \(O(nV)\) 的,非常不好,我们考虑优化。

发现从大往小枚举阶乘的过程中,相当于我乘上一个 \(\frac{1}{i}\),对应的质因子幂次减去一个数,发现更改项最多是质因子个数级别,也就是 \(O(\log V)\) 级别,于是我们可以暴力在线段树上更改,然后我们要求的就是 \(a_i - c \times b_i\),这个东西我们转化成 \(\frac{a}{b}\),然后求一个最小值,和区间和即可。

代码:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/71811.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

B 站 硬币奖励不合理规则 All In One

B 站 硬币奖励不合理规则 All In One 💩 观众投币的百分之十将作为UP主的硬币收入奖励, 那 90% 的硬币去哪了呢?B 站 硬币奖励不合理规则 All In One💩 观众投币的百分之十将作为UP主的硬币收入奖励, 那 90% 的硬币去哪了呢?硬币规则如何给稿件投硬币?1.正式会员可以通过…

[单机]梦幻国度类似爱如初见+新版Q萌冒险剧情端游安装教程+虚拟机一键端

今天给大家带来一款单机游戏的架设:梦幻国度 另外:本人承接各种游戏架设(单机+联网) 本人为了学习和研究软件内含的设计思想和原理,带了架设教程仅供娱乐。 教程是本人亲自搭建成功的,绝对是完整可运行的,踩过的坑都给你们填上了。如果你是小白也没问题,跟着教程走也是…

狗子!!!

表情包专区 就想记录一下以前现在之后画出来的狗子图片而已。 某段时间前使用 mspaint,之后改为使用 SAI2。

Nuxt.js 应用中的 modules:before 事件钩子详解

title: Nuxt.js 应用中的 modules:before 事件钩子详解 date: 2024/10/15 updated: 2024/10/15 author: cmdragon excerpt: modules:before 是 Nuxt.js 中一个重要的生命周期钩子,在 Nuxt 应用初始化期间被触发。该钩子允许开发者在安装用户定义的模块之前执行某些操作,如…

微信小程序-定位经纬度和展示内嵌地图

结果展示: 点击获取经纬度: 点击展示地图:WXML文件:<!--pages/location…

Linux 教程

目录Linux 初识:Linux 简介:虚拟机:虚拟机快照:目录结构:Linux 路径:Linux 基础命令:基础语法:路径篇:ls 命令:cd-pwd 命令:特殊路径符:文件篇:mkdir 命令:touch-cat-more 命令:cp-mv-rm 命令:which-find 命令:grep-wc 命令:管道符:拓展篇:echo 命令:反引…

计量经济学(四)——序列相关性的检验与修正

img { display: block; margin-left: auto; margin-right: auto } table { margin-left: auto; margin-right: auto } 序列相关性(Serial Correlation)是指在时间序列或截面数据的回归模型中,误差项之间存在相关性。这种现象意味着当前误差项的值会受到前期误差项的影响,误…