2023山东ICPC省赛Problem E. Math Problem

2023 山东 I C P C 省赛 P r o b l e m E . M a t h P r o b l e m \Huge{2023山东ICPC省赛Problem E. Math Problem} 2023山东ICPC省赛ProblemE.MathProblem

文章目录

  • 题意
  • 思路
  • 标程

比赛链接:Dashboard - The 13th Shandong ICPC Provincial Collegiate Programming Contest - Codeforces

官方题解:E - 数学问题 - SUA Wiki

题意

首先给出五个数字: n , k , m , a , b n,k,m,a,b n,k,m,a,b;然后可以对n执行进行以下两种操作任意次:

  • 选择一个整数 x ( 0 ≤ x ≤ k ) x(0 \le x \le k) x(0xk);令 n = k × n + x n=k\times n + x n=k×n+x,该操作每次花费 a a a枚金币,每次选择的 x x x可以不同。
  • 令$n=\left \lfloor \frac{n}{k} \right \rfloor ,该操作每次花费 ,该操作每次花费 ,该操作每次花费b$枚金币。

求将 n n n变为** m m m的倍数**最少需要花费几枚金币( 0 0 0是任何正整数的倍数)。

数据范围:

  • ( 1 ≤ n ≤ 1 0 18 1\leq n\leq 10^{18} 1n1018, 1 ≤ k , m , a , b ≤ 1 0 9 1\leq k, m, a, b\leq 10^9 1k,m,a,b109)

思路

跟据两种操作,我们会发现,若执行一次操作①后,再执行一次操作②;那么这两次操作可以相互抵消, n n n的值不变。

因此我们会发现,执行完操作①之后将不再会执行操作②。

跟据题目数据范围可知,操作①和操作②之和不会超过 200 200 200次,是比较小的。然后跟据上面的结论,我们可以暴力枚举先执行操作②的次数。

由于操作①有+x的情况,因此进行 p p p次操作①后, n n n的范围为: [ k p × n 0 , k p × ( n 0 + 1 ) − 1 ] [k^p\times n_0,k^p\times (n_0+1)-1] [kp×n0,kp×(n0+1)1](其中 n 0 n_0 n0 n n n完成除法操作时的值),因此只要 n n n在此区间即可停止乘法操作。

需要注意的是,在枚举的过程中,答案可能会超过long long范围,因此需要使用__int128__int128无法直接读入和输出,只能使用快读读入)。

其实我们在计算 n n n的范围时,只需要将其对 m m m取模即可,因为我们只需要判断当前 n n n的值距离 m m m的倍数的距离即可。

标程

#include<bits/stdc++.h>using namespace std;#define IOS ios::sync_with_stdio(false); cin.tie(nullptr), cout.tie(nullptr);
#define int long long 
#define ULL unsigned long long 
#define PII pair<int, int>
#define lowbit(x) (x & -x)
#define Mid ((l + r) >> 1)
#define ALL(x) x.begin(), x.end()
#define endl '\n'
#define fi first 
#define se secondconst int INF = 0x7fffffff;
const int Mod = 1e9 + 7;
const int N = 2e5 + 10; void Solved() { int n, k, m, a, b; cin >> n >> k >> m >> a >> b;if(n % m == 0) {cout << "0\n"; return;}if(k == 1) {cout << "-1\n"; return;}int res = 1e18, cost = 0;//双重循环,第一层枚举除的次数,第二层枚举乘的次数while(1) {int base = n % m, p = 1;for(int i = 0; ; i ++ ) {int d = (m - base) % m;//需要对m取模,表示距离每个m的倍数的位置// int d = m - base;// if(d == m) d = 0;if(d < p) {res = min(res, cost + i * a);break;}base = base * k % m;p = p * k;//对于x的累加不需取模}if(n == 0) break;n /= k;cost += b;}cout << res << endl;
}signed main(void) {IOSint ALL = 1; cin >> ALL;while(ALL -- ) Solved();// cout << fixed;//强制以小数形式显示// cout << setprecision(n); //保留n位小数return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

二叉树顺序结构的实现(堆)

二叉树的基本概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的。 有一个特殊的结点&#xff0c;称为根结…

How to record real IP of user on nginx?

应用(Docker)使用WAF接入internet&#xff0c;nginx log 查不到用户的真实IP地址&#xff0c;于是修改nginx 设置&#xff0c;以下都是在linux下操作&#xff1a; 由于没有WAF权限&#xff0c;所以在 docker上启动了两个container&#xff0c;一个模拟WAF(r-proxy)&#xff0c…

软考 系统架构设计师系列知识点之SOME/IP与DDS(2)

接前一篇文章&#xff1a;软考 系统架构设计师系列知识点之SOME/IP与DDS&#xff08;1&#xff09; 本文内容参考&#xff1a; 车载以太网 - SOME/IP简介_someip-CSDN博客 https://zhuanlan.zhihu.com/p/369422441 什么是SOME/IP?_someip-CSDN博客 SOME/IP 详解系列&#…

基础—SQL—DML(数据操作语言)插入数据

一、介绍 分类全称说明DMLData Manipulation Language数据操作语言。用来对数据库表中的数据进行增删改(插入、删除、修改) 则增、删、改是三个操作也就对应着三个关键字&#xff0c;分别是&#xff1a; 添加数据&#xff1a;&#xff08; INSERT &#xff09;修改数据&#…

521源码-免费音乐源码-最新流媒体在线音乐系统网站源码| 英文版源码| 音乐社区 | 多语言 | 开心版

免费音乐源码 一键自动安装&#xff1a;安装用翻译看提示操作即可 本源码下载地址&#xff1a;最新流媒体在线音乐系统网站源码| 英文版源码| 音乐社区 | 多语言 | 开心版 - 521源码 更多网站源码学习教程&#xff0c;请点击&#x1f449;-521源码-&#x1f448;获取最新资源…

conda install卡在solving environment不动

参考官方issue&#xff1a;https://github.com/conda/conda/issues/11919 之前用conda安装pytorch的时候发现用conda install一直会卡在solving environment不动&#xff0c;后来被迫使用pip install才避免了这个问题。 例如&#xff1a; Solving environment: failed with ini…

Python数据分析:【NumPy系列】numpy中形状变换的函数用法总结

文章目录 引入问题np中引入问题 numpy中(36864, 1)和(36864, )有区别吗 在NumPy中,形状为 (36864, 1) 的数组和形状为 (36864,) 的数组确实存在区别。 维度不同: (36864, 1) 表示一个二维数组,其中有36864行和1列。这是一个列向量。(36864,) 表示一个一维数组,其中包含3686…

Spring Boot集成rss快速入门demo

1.什么是rss&#xff1f; RSS 的全称是「简易内容聚合」&#xff08;Really Simple Syndication&#xff09;&#xff0c;是一个能让你在一个地方订阅各种感兴趣网站的工具。 一个网站支持 RSS&#xff0c;就意味着每当它新发布一篇新文章&#xff0c;就会往一个位于特定网址的…

Shell脚本学习笔记(更新中...)

一、什么是shell shell的作用是&#xff1a; 解释执行用户输入的命令程序等。 用户输入一条命令&#xff0c;shell就解释一条。 键盘输入命令&#xff0c;LInux给与响应的方式&#xff0c;称之为交互式。 shell是一块包裹着系统核心的壳&#xff0c;处于操作系统的最外层&a…

C#_类型转换之隐式转换

类型转换就是不同变量数据类型之间进行互相转换 隐式转换 : 默认是C#中安全的进行数据转换的方式 一般不会造成数据丢失 隐式转换方法 long l 1; int i 2; 转换: l i; 相同变量数据类型隐式转换 有符号整形变量: 大小排列&#xff1a; long -> int ->short ->sbyt…

Java从坚持到精通-SpringBoot项目-多来米云客(持续更新中)

1.项目介绍 该项目模仿动力云客制作&#xff0c;是一款商业的集营销销售为一体的客户关系管理系统&#xff0c;其采用信息化、数字化方式来进行营销销售及客户管理。 云客指的是海量客户&#xff0c;通过技术方式实现的这一套系统&#xff0c;可用于自动化分析销售、市场营销…

饮料添加剂新型褪色光照试验仪器太阳光模拟器

太阳光模拟器的定义和功能 太阳光模拟器是一种高科技设备&#xff0c;它可以模拟太阳光的光谱、光强和光照条件&#xff0c;用于实验室环境中对太阳能电池、光电器件以及其他需要太阳光条件的设备和材料进行评估。太阳光模拟器的主要功能包括模拟太阳光的光谱分布、辐照度、光…

LXQ一次消谐的技术指导都有哪方面

LXQ一次消谐器是电力系统中用于消除谐波的设备&#xff0c;它的作用是通过电感和电容的组合&#xff0c;将系统中的谐波电流抵消掉。在安装一次消谐器时&#xff0c;正确的接线方法是非常关键的&#xff0c;下面将简单介绍一下一次消谐器的接线方法。首先&#xff0c;需要确认L…

使用JSON_EXTRACT匹配某个json类型字段中的某个具体字段

使用JSON_EXTRACT匹配某个json类型字段中的某个具体字段 1. 使用场景2. 来自ChatGPT的JSON_EXTRACT使用说明 1. 使用场景 如果你有一张表table&#xff0c;其中有一个字段attrs&#xff0c;并且该字段是一个json&#xff0c;其中又包括totalPrice、skuPrice、couponPrice三个字…

在vue中如何使用leaflet图层展示地图

在vue中如何使用leaflet <template><div id"map" class"map"></div> </template><script> export default {data () {return {};},mounted(){this.initMaps()},methods: {initMaps () {const map L.map(map, {zoomControl…

阿里云获取nginx头部

k8s 配置 可以修改kube-system/nginx-configuration configmap的方式&#xff0c; compute-full-forwarded-for: “true” forwarded-for-header: “X-Forwarded-For” use-forwarded-headers: “true” https://help.aliyun.com/zh/ack/ack-managed-and-ack-dedicated/user-g…

ubuntu 22.04 appearance设置没有dock选项

1、问题描述 解决办法可以直接跳到后面见2 下图是我同学电脑的appearance界面选项&#xff0c;她有Dock的界面显示。 下面是我的界面&#xff0c; 没有Dock&#xff1a; 然后各种app的界面都在最底下&#xff0c;而且每次只能点击左上角的activities才能显示。 但是如果不打开某…

使用 Django 与 Redis 实现缓存优化

文章目录 什么是Redis&#xff1f;为什么选择Django与Redis&#xff1f;如何在Django中使用Redis&#xff1f;总结与拓展 在Web开发中&#xff0c;性能优化是一个至关重要的方面。而使用缓存是提高Web应用性能的常见方法之一。在这篇文章中&#xff0c;我们将探讨如何结合Djang…

C#控制台-输出输入、占位符

输出输入 输入: Console.ReadLine(); 输出: Console.WriteLine(); console控制台 write写 line行 占位符: 使用大括号{} 里面的值 从零开始 一一对应 占位符使用方法: Console.WriteLine("圆的半径为:{0}&#xff0c;圆的周长为:{1}&#xff0c;圆的面积为:{2}"…

[JDK工具-10] jvisualvm 多合一故障处理工具

文章目录 1. 介绍2. 查看堆的变化3. 查看堆快照4. 导出堆快照文件5. 查看class对象加载信息6. CPU分析&#xff1a;发现cpu使用率最高的方法7. 查看线程快照&#xff1a;发现死锁问题 1. 介绍 VisualVM 是一款免费的&#xff0c;集成了多个 JDK 命令行工具的可视化工具&#xf…